Inferno #08
30 ноября 2005

Sofтинка - Техническое руководство по дисковой системе DISCiPLE/+D.

           RAMSOFT представляет:
────────────────────────────────────────── 
  ТЕХНИЧЕСКОЕ РУКОВОДСТВО ПО DISCiPLE/+D
 ────────────────────────────────────────── 
        Версия 8 (09 сентября 1999)
   Перевод с английского - Alone Coder
 

                СОДЕРЖАНИЕ:
               ===========
1....Главные особенности DISCiPLE/+D 
2....Распределение памяти 
3....Порты ввода/вывода (I/O) 
3.1..Порт 7Bh (123 dec) в DISCiPLE 
4....Структура UFIA 
5....Системные вызовы (hook codes) 
5.1..Внутренние системные вызовы 
5.2..Пример программирования: Load file 
6....Формат диска 
7....Структура дескриптора файла 
8....Таблица типов файлов 
9....Дополн. команды бейсика GDOS/G+DOS 
9.1..Сеть 
9.2..Кнопка snapshot 
9.3..Сообщения об ошибках G(+)DOS и UNIDOS 
10...Сис. переменные GDOS/G+DOS и UNIDOS 
11...Дополнительные команды бейсика UNIDOS 
12...Распиновки разъёмов 
12.1.Подключение дисковода PC 5.25" 
13...Программирование VL1772 FDC 
14...Авторы и контактные адреса 
 

               ПРЕДУПРЕЖДЕНИЕ
              ==============
   Хотя мы старались быть аккуратными, до─
кумент  может  содержать ошибки. Авторы не
несут  ответственности  за любые потери и/
или  повреждения, прямо или косвенно нане─
сённые  вашей  системе из-за использования
приведённой здесь информации. Список авто─
ров смотрите в конце документа.
 

                ПРЕДИСЛОВИЕ
               ===========
   Мы (Ramsoft) давно используем интерфейс
DISCiPLE и оценили мощь этой дисковой сис─ 
темы.Мы провели много часов в попытках по─
нять мельчайшие детали,чтобы получить дос─
туп  ко  всем  возможностям, но многое ещё
предстоит выяснить. Теперь мы решили опуб─
ликовать всю информацию, которую собрали в
основном сами, и надеемся, что она поможет
каждому и что благодаря ей появится больше
программ под эту замечательную систему.
 

               ОБЩИЕ ТЕРМИНЫ
              =============
 DRAM - Секторный буфер. 
 RPT - Системная переменная,указывающая на
       байт в DRAM.
 UFIA - 24-байтный хэндл файла (User File 
        Information Area, a 24 byte
        structure which describes a file
       for system calls).
 DFCA - Область канала файла (Disk File 
       Channel Area).
 

        1. Особенности DISCiPLE / +D
        ============================
   8 KB EPROM (для дискового BIOS'а)
   8 KB ОЗУ
   Магическая кнопка NMI (snapshot)
   Параллельный порт (однонаправленный)
   Floppy disk port (контроллер VL1772 FDC) 
  Высокоскоростные дисковые операции:
загрузка 128K меньше чем за 7 секунд. 
 

           Особенности DISCiPLE:
  Два порта джойстиков ATARI (Sinclair 1,
 Sinclair 2 / Kempston) 
  Два сетевых разъёма (3.5mm mono jack,
 сеть совместима с Interface 1 ) 
   Кнопка отключения (блокирует интерфейс)
  Системный разъём сзади
(для подключения других устройств) 
 

          2. РАСПРЕДЕЛЕНИЕ ПАМЯТИ
         =======================
   Когда  память интерфейса открыта (paged
in), т.е. включена в адресное пространство
Z80 (см. ниже), первые 16K этого адресного
пространства распределены так:

Адрес│DISCiPLE GDOS│DISCiPLE UNIDOS│  +D 
─────┼─────────────┼───────────────┼────── 
0000h│   8K ОЗУ    │    8K ПЗУ     │8K ПЗУ 
2000h│   8K ПЗУ    │    8K ОЗУ     │8K ОЗУ 

   Таким  образом, распределение  памяти в
UNI-DOS  одинаковое  как  на  +D, так и на 
DISCiPLE. См. [3.1] по поводу обмена адре─ 
сов ПЗУ/ОЗУ на DISCiPLE.
 

   3. Порты ввода/вывода DISCiPLE и PlusD
   ======================================
   ПРИМЕЧАНИЕ:  Joystick  1 - одновременно
Kempston  (порт 1Fh)  и Sinclair 2 (кнопки 
6,7,8,9,0).Joystick 2 - Sinclair 1 (кнопки 
1,2,3,4,5). Сеть совместима с Interface 1. 

             Порты DISCiPLE:
Порт│  In        │  Out          │ Прим. 
────┼────────────┼───────────────┼──────── 
1Bh │статус FDC  │команда FDC    │см.[13] 
5Bh │рег.дорожки │дорожка        │ 
9Bh │рег.сектора │рег.сектора    │ 
DBh │рег.данных  │рег.данных     │ 
 1Fh │ Joystick 1:│ Управление:   │ 
   b0│вправо      │выбор дисковода│
   b1│влево       │выбор стороны  │
   b2│вниз        │SD/DD плотность│
   b3│вверх       │выбор банка ПЗУ│
   b4│огонь       │упр.блокировкой│
   b5│     ──     │ext. select (?)│
   b6│BUSY принтер│STROBE принтеру│
  b7│сеть        │сеть           │
3Bh │     ──     │ждать до сеть=0│ (*) 
7Bh │вкл.перезагр│выкл.перезагр. │см.[3.1] 
BBh │откр. память│спрятать память│ (**) 
FBh │     ──     │данные принтера│ 
FEh │Joystick 2  │      ──       │Sinclair 

(*) Порт 3Bh используется для сетевой син─ 
хронизации  (то  же, что  bit 5  порта EFh 
Интерфейса 1 ).Любой OUT в порт 3Bh задер─ 
жит  Spectrum, пока  логический  уровень в 
сети  не встанет в 0. Это используется для 
ожидания старт-бита кадра передачи.Сетевая 
шина  имеет уровни ТТЛ (0 = 0 вольт, 1 = 5 
вольт).Частота следования битов 87.5 Kbps, 
данные  передаются в пакетах длиной до 256 
байт  включительно с помощью простого про─ 
токола уровня data-link. 

               Порты PlusD:
Порт│  In        │  Out          │ Прим. 
────┼────────────┼───────────────┼──────── 
E3h │статус FDC  │команда FDC    │см.[13] 
EBh │рег.дорожки │дорожка        │ 
F3h │рег.сектора │рег.сектора    │ 
FBh │рег.данных  │рег.данных     │ 
EFh │            │ Управление:   │ 
 b0/1│     ──     │выбор дисковода│ 
   b2│     ──     │SD/DD плотность│
   b3│     ──     │выбор банка ПЗУ│
   b4│     ──     │      ──       │
   b5│     ──     │ext. select (?)│
   b6│     ──     │STROBE принтеру│
  b7│     ──     │выбор стороны  │
E7h │откр. память│спрятать память│ (**) 
F7h │b7=BUSY     │данные принтера│ 

(**) Кроме того,память DISCiPLE и +D вклю─ 
чается, когда  Z80  переходит  к  адресам: 
0x0000, 0x0008, 0x0066, 0x028E. 
 

   3.1. ПОРТ 7Bh И АДРЕСА ПАМЯТИ DISCiPLE
  ======================================
   Порт  7Bh (123 десятичное) доступен то─
лько  на  DISCiPLE и имеет триггер. Меняет
местами ОЗУ и ПЗУ:

Доступ │ ПЗУ   │ ОЗУ   │  Результат 
 ───────┼───────┼───────┼────────────────── 
   IN   │0x0000 │0x2000 │сброс триггера
 OUT   │0x2000 │0x0000 │установка триггера

   Эту возможность использует GDOS для оп─
ределения, нужно ли грузить файл системы с
диска (при включении или двукратном сбросе
без выполнения команд ДОС между сбросами);
UNIDOS эту возможность игнорирует, так что 
попытка переключения завалит систему.
   В GDOS есть переменная,лежащая в ОЗУ по
смещению  0x1DE4 - она  устанавливается  в
0x44 ('D') после проверки синтаксиса BASIC 
(т.е. после RST 08h с кодом меньше 1Bh ) и
после  начальной  загрузки: эта переменная
показывает,что средства ДОС вызывались как
минимум однажды.Когда пользователь сбрасы─
вает компьютер,триггер порта 7Bh сбрасыва─
ется, в результате чего ПЗУ попадает в об─
ласть 0x0000. Когда происходит первое пре─
рывание,вызывается процедура опроса клавиш
0x028E - и  память  DISCiPLE автоматически 
становится  видимой. По  смещению 0x028E в
ПЗУ DISCiPLE размещена процедура, проверя─
ющая ту самую переменную, где лежит 0x44:
 - если  оно  там  лежит, то эта процедура
кладёт  туда  00h, что  означает "средства 
ДОС не вызывались с момента сброса"; 
 - иначе (т.е.если там не 0x44 ) процедура
кладёт в эту переменную число 0x53 ('S') и 
копирует  первые  2335 (0x091F) байт ПЗУ в 
ОЗУ:в этом случае файл системы должен быть 
перезагружен. 
   Когда  всё  закончено,  области  памяти
опять переставляются (т.е.триггер устанав─
ливается)  путём OUT в порт 7Bh, потом па─
мять  DISCiPLE  прячется  путём OUT в порт
BBh и - наконец-то - вызывается  процедура 
опроса клавиш.
   Чтение из порта 7Bh для ДОС означает то
же,что сброс компьютера,поэтому после двух
чтений  из порта 7Bh (без ввода команд ДОС
между этими чтениями) файл системы требует
 перезагрузки.
   ОБРАТИТЕ ВНИМАНИЕ:  поскольку  всё  это
основано  на процедуре опроса клавиш в ПЗУ 
Spectrum'а, то ничего не случится при чте─ 
нии  из  порта 7Bh, если при этом вышеука─ 
занная процедура  не вызывается (т.е. если 
прерывания запрещены, или если мы в режиме 
IM 2  и сканируем клавиатуру другим спосо─ 
бом); однако последняя (перед вызовом ДОС) 
операция с портом 7Bh должна быть OUT, ес─ 
ли мы хотим  оставить ДОС в неприкосновен─ 
ности. 
 

           4. ХЭНДЛ ФАЙЛА (UFIA)
          =====================
   Это ДОСовая структура, часто используе─
мая  процедурами  ядра и обычно сидящая по
адресу IX.

Смещ│Дл│            Значение 
 ────┼──┼────────────────────────────────── 
  0  │ 1│Номер дисковода (1,2 или '*' (2Ah)
     │  │для текущего)
  1  │ 1│Номер программы (в каталоге)
  2  │ 1│Номер потока
  3  │ 1│Плотность записи ('d'=DD, 'D'=SD)
  4  │ 1│Номер типа файла из директории
     │  │(см. ниже)
  5  │10│Имя файла (дополненное пробелами)
     │  │/Расширения нет.Можно использовать
     │  │точку, чтобы условно показать рас─
     │  │ширение.8.3 невозможно - для этого
    │  │потребовалось бы 12 байт. - A.C./
 15  │ 1│ROM-ID - магнитофонный тип файла 
    │  │(см. ниже)
16  │ 2│Длина файла 
18  │ 2│Начальный адрес 
20  │ 2│Длина для Basic 
22  │ 2│Номер строки автозапуска 
 

            5. СИСТЕМНЫЕ ВЫЗОВЫ
       (одинаковые для DISCiPLE и +D)
           ===================
   Для доступа к средствам системы исполь─
 зуйте протокол Интерфейса 1 (IF1):
         RST 8
        DB #service
   Все функции возвращают код ошибки в ре─
 гистре A.
   ВАЖНЫЕ ЗАМЕЧАНИЯ: Вы не можете вызывать
RST 8 из процедур, лежащих в ОЗУ интерфей─ 
са. Вы не можете вызывать процедуру 0x028E 
(опрос клавиш) из обработчика прерываний - 
это вызовет сбой, если DISCiPLE/+D подклю─ 
чен; некоторые  программы  из-за  этого не 
работают  (напр., SoundTracker v1.1 ) - вы 
можете  исправить  это  положение, заменив 
CALL #028E на RST #38. Некоторые программы 
(типа дискофицированных игр) не используют 
механизм RST 8, а делают абсолютные CALL'ы 
процедур DOS или BIOS - это плохой метод! 

   Вот  список hook code'ов GDOS3 (G+DOS2)
со входными параметрами:
 

    Поддержанные hook code'ы Интерфейса 1:
 CONSIN (1Bh) - Ввод с консоли
 CONSOUT (1Ch) - Вывод на консоль 
  PRTOUT (1Fh) -
  KBDTST (20h) -
  SELDRV (21h) - Выбор дисковода
  OPTMPM (22h) -
  CLOSEM (23h) -
   ERASE (24h) -
   RDSEQ (25h) -
   WRREC (26h) -
  OPTMPM (2Bh) -
  DELBUF (2Ch) -
  UNPAGE (31h) - Спрятать теневое ПЗУ
   CALL (32h) - Вызвать процедуру тен. ПЗУ

 Специфичные для GDOS3(G+DOS2) hook code'ы: 
  HXFER (33h) - Копир. хэндл файла в DFCA.
                 IX = адрес хэндла (UFIA)
  OFSM  (34h) - Открыть карту секторов
                файла (file sector map) с
                информацией из DFCA.
                Указатель RPT устанавлива─
                 ется на начало DRAM.
  HOFLE (35h) - Открыть файл.
                IX = UFIA
                Комбинация двух предыдущих
                функций. Устанавливает
                последние 9 байт UFIA в
                 соотв. с заголовком файла.
  SBYT  (36h) - Сохранить байт в DRAM по
                адресу RPT. /Этой функции
                и функций 37h, 3Ch, 3Dh не
                хватает в TR-DOS. - A.C./
                A = байт
                Если секторный буфер пере─
                полнен, он автоматически
                 сохраняется на диск.
  HSVBK (37h) - Сохранить блок данных.
                DE = начало данных
                 BC = длина в байтах
  CFSM  (38h) - Закрыть file sector map.
                Выгружает (flush) DRAM,
                закрывает файл и обновляет
                 директорию.
  PNTP  (39h) - Вывод байта в паралл.порт.
                 A = байт
   COPS  (3Ah) - Вывести экран на принтер.
  HGFLE (3Bh) - Открыть блок данных файла.
                IX = UFIA
                1-й сектор файла грузится
                в DRAM. RPT устанавливает─
                ся на начало. /Для чтения
                вряд ли используется тот
                же секторный буфер, что и
                для записи (в гл. 9 приве─
                дён пример копирования из
                одного открытого файла в
                 другой).- A.C./
  LBYT  (3Ch) - Прочитать байт по адр.RPT.
                Возвращает A = байт.
                Если необходимо, с диска
                читается очередной сектор.
                 RPT инкрементируется.
  HLDBK (3Dh) - Загрузить блок данных.
                DE = начальный адрес (куда
                     класть данные)
                 BC = длина в байтах
  WSAD  (3Eh) - Записать DRAM на диск.
                D = дорожка
                E = сектор
                 RPT ставится на нач. DRAM.
  RSAD  (3Fh) - Прочитать сектор в DRAM.
                D = дорожка
                E = сектор
                 Аналогично 3Eh.
  REST  (40h) - Сбросить дисковод и искать
                дорожку 0. Номер дисковода
                 указан в UFIA.
  HERAZ (41h) - Удалить в диска файл,
                указанный в UFIA.
                 IX = UFIA.
         (42h) - Большая распечатка экрана.
  PCAT  (43h) - Каталог диска /Нет функции
                возврата списка файлов в
                программу пользователя
                (разве что создав свой ка─
                нал и перенаправив каталог
                в него). А даже в обруган─
                ном TR-DOS можно прочесть
                каталог "честно": вызовами
                функции #08! - A.C./
                Использует информацию из
                UFIA. Дисковод и поток
                должны быть установлены.
                По смещению +0Fh в UFIA
                д.б. одно из значений:
                  02h для CAT !
                  04h для CAT
                  12h для CAT ! с маской
                      имени файла
                  14h для CAT с маской
                      имени файла
                Имя файла должно лежать по
                смещению +05 в UFIA и
                может содержать знаки
                 маски (wildcards).
  HRSAD (44h) - Прочитать сектор
                 A = номер дисковода
                 D = номер дорожки
                 E = номер сектора
                 IX = адрес, куда читать
  HWSAD (45h) - Записать сектор
                 A = номер дисковода
                 D = номер дорожки
                 E = номер сектора
                 IX = откуда записывать
        (46h) - Открывать/закрывать потоки
                 (как?)
  PATCH (47h) - Вызвать? (to page) теневую
                память.
                Возвр. HL=0 для DISCiPLE
                       HL=1 для PlusD
                       HL=2 для DiSCDOS
 

    Специфичные для UNIDOS hook code'ы:
         (48h) - Load file
         (49h) - Verify file
         (4Ah) - Merge
         (4Bh) - Save file
         (4Ch) - Открыть файл
         (4Dh) - POINT (см. UNIDOS)
        (4Eh) - Опустошить (flush) буферы
                 на диск
         (4Fh) - Закрыть файл
         (50h) - Очистить каналы
         (51h) - Rename file
         (52h) - Move stream
         (53h) - Move file
        (54h) - Выбрать диск и директорию
 

      5.1. ВНУТРЕННИЕ СИСТЕМНЫЕ ВЫЗОВЫ
       (одинаковые для DISCiPLE и +D)
     ================================
   Приводим  результат  команд  RST, когда
память DISCiPLE или +D открыта (paged in).

RST 00h - Сброс 
RST 08h - Вызвать функцию системы; номер 
          функции должен быть в следующем
          байте (1)(2)
RST 10h - Вызвать процедуру ПЗУ Spectrum; 
          адрес должен быть в следующих 2
          байтах (3)
RST 18h - GDOS, G+DOS : зарезервировано 
          (для проверки синтаксиса)
          Uni-DOS : низкоуровневые систем─
          ные функции;номер функции должен
          быть в следующем байте
RST 20h - Напечатать ДОСовое сообщение об 
          ошибке: код ошибки должен быть в
          следующем байте
RST 28h - Вызвать функцию RST 20h ПЗУ 
          Spectrum'а
RST 30h - Узнать состояние интерпретатора: 
          Z=0, если проверка синтаксиса,
          Z=1, если выполнение
RST 38h - Включить прерывания 

(1) = В Spectrum 128K должно быть включено 
      ПЗУ 1
(2) = При это вызове интерфейс автоматиче─ 
      ски открывает (page in) свою память
(3) = Проследите, чтобы было включено пра─ 
      вильное ПЗУ Spectrum'а
 

        5.2. ПРИМЕР: ЗАГРУЗКА ФАЙЛА
       ===========================
   Приводим простой загрузчик, часто испо─
льзуемый в наших программах. Он грузит ко─
довый файл "blk0.DF" в память по его нача─
льному адресу. Процедура работоспособна на
DISCiPLE, +D  и UNIDOS (всех версий). Вни─ 
мание: нет обработки ошибок.
 LOAD  LD IX,UFIA    ;IX указывает на хэндл 
       RST 08:DB #3B   ;HGFLE: открыть файл
       LD DE,UFIA+0F ;загол.файла будет тут
      LD B,09       ;(первые 9 байт файла)
 L_HDR RST 08:DB #3C    ;LBYT: байт из DRAM 
       LD (DE),A               ;кладём байт
       INC DE
       DJNZ L_HDR       ;достать все 9 байт
       LD DE,(UFIA+10) ;начальн.адрес файла
       LD BC,(UFIA+12)         ;длина файла
       RST 08:DB #3D   ;HLDBK: загр. данные
      RET                          ;конец!
   Ниже показан UFIA.Только первые 15 байт
должны быть заданы пользователем перед вы─
зовом  HGFLE. Последние 9 байт заполняются
9-ю байтами заголовка файла.
 UFIA    01  ;номер дисковода ('*'=текущий) 
         00
         00
         'd'
         04            ;тип файла 04 = CODE
        "blk0.DF   "            ;имя файла
                  ;(дополненное пробелами)
UFIA+0F 00         ;будет содержать ROM-ID 
UFIA+10 00,00 ;будет содержать адрес файла 
 UFIA+12 00,00 ;будет содержать длину файла 
         00
         00
         00
        00
   Обратите внимание, что адрес загрузки и
длина  читаются из 9 байт заголовка самого
файла. Чтобы  заставить файл загрузиться с
другого адреса, просто замените инструкцию
LD DE,(UFIA+10) (напр., прямым LD DE,nn ). 
     DISCiPLE/+D - формат
              6. ФОРМАТ ДИСКА
             ===============
   Диск  имеет  80  дорожек по 10 секторов
(512-байтных  для  двойной плотности, 256-
байтных для одинарной),общая ёмкость 800KB
(DS/DD). Первые  4  дорожки диска (дорожки
0-3 стороны 0) зарезервированы для системы
и содержат директорию, оставляя 780KB сво─
бодного  места. Директория  состоит  из 80
последовательных дескрипторов файла,каждый
из которых занимает 256 байт; напр., деск─
риптор файла #48 лежит в первых 256 байтах
сектора  4  дорожки  2.  Директория  имеет
фиксированную  ёмкость  и  может содержать
только  80 файлов. UNIDOS преодолевает это
ограничение, вводя  подкаталоги и позволяя
указать максимальное количество файлов для
каждого из них.
   Диски,отформатированные на DISCiPLE или
+D, могут быть прочитаны/записаны на обыч─ 
ных PC-шных дисководах - и наоборот.
 

       7. СТРУКТУРА ДЕСКРИПТОРА ФАЙЛА
       ==============================
   ВНИМАНИЕ: Все числа десятичные.

             Основная структура
            ------------------
 Смещение            Значение 
   0     Тип файла (см. таблицу типов фай─
         лов); 0=удалён (свободная запись)
 1-10   Имя файла (дополненное пробелами)
 11-12   Число секторов, занятых файлом 
         (старший байт впереди)
  13     Номер дорожки 1-го сектора файла
 14     Номер сектора 1-го сектора файла
 15-209  Карта расположения секторов 
         (Sector allocation bitmap=s.a.b.)
         Каждый бит соответствует сектору
         диска. Бит установлен,если соотв.
         сектор относится к файлу.Примеры:
         байт 15,бит 0=дорожка 4,сектор 1;
        байт 16,бит 3=дорожка 5,сектор 2.
   ВАЖНОЕ ЗАМЕЧАНИЕ: S. a. b. используется
только во время операций сохранения:s.a.b. 
всех  80 файлов объединяются по ИЛИ, и так 
система узнаёт, какие сектора свободны. 
того, кто  придумал этот формат, очевидно, 
были проблемы с головой:) - A.C./ Во время 
загрузки используется более скоростной ме─ 
тод:каждый сектор содержит только 510 байт 
данных;в последних 2 байтах хранится номер 
дорожки и номер сектора для следующего се─ 
ктора файла.Последний сектор цепочки соде─ 
ржит (0,0) в последних 2 байтах. 
210-255 Зависит от типа файла. 

               BASIC (тип 1)
              -------------
211     Всегда 0 (это ROM-ID - 
        идентификатор, взятый из
        кассетного заголовка)
212-213 Длина 
214-215 Начальный адрес в памяти (PROG 
        при загрузке - обычно 23755)
216-217 Длина без переменных 
218-219 Строка автозапуска 
   ПРИМЕЧАНИЕ: Эти  9  байт также являются
первыми 9-ю байтами файла. 

            NUMBER ARRAY (тип 2)
           --------------------
 211     Всегда 1 (это идентификатор, 
        взятый из кассетного заголовка)
212-213 Длина 
214-315 Начальный адрес в памяти 
216-217 Имя массива - игнорируется? 
218-219 Не используется 
   ПРИМЕЧАНИЕ: Эти  9  байт также являются
первыми 9-ю байтами файла. 

            STRING ARRAY (тип 3)
           --------------------
 211     Всегда 2 (это идентификатор, 
        взятый из кассетного заголовка)
212-219 Как в типе 2 
   ПРИМЕЧАНИЕ: Эти  9  байт также являются
первыми 9-ю байтами файла. 

             CODE FILE (тип 4)
            -----------------
 211     Всегда 3 (это идентификатор, 
        взятый из кассетного заголовка)
212-213 Длина 
214-315 Начальный адрес 
216-217 Не используется 
218-219 Адрес автозапуска (0, если нет) 

            48K SNAPSHOT (тип 5)
           --------------------
211-219 Не используется 
 220-255 Регистры Z80 (в виде 2-байтных 
         слов) в следующем порядке:
         IY IX DE'BC'HL'AF' DE BC HL I SP
         (см. ниже про R и AF)
         Регистр I - старший байт соответ─
         ствующего слова (смещение 239),
         он грузится так:
           POP AF
           LD I,A
         Режим прерываний определяется по
         значению регистра I: если I соде─
         ржит 00h или 3Fh, то IM 1, иначе
         IM 2. Состояние флага разрешения
         прерываний IFF2 (IFF1=IFF2) полу─
         чается из флага P/V.
         Вместо SP реально хранится SP-6,
         поскольку исходный стек
         "портится" следующими 6 байтами:
           R AF PC
           |     |
           SP    SP+6 (исходный SP)
         ( R - старший байт соотв. слова),
         поэтому запускалка оканчивается
         чем-то вроде этого (на самом деле
         несколько сложнее):
           POP AF
           LD R,A
           POP AF
          RET

                MDRV (тип 6)
               ------------
   Это образ картриджа микродрайва. Детали
опустим.
   ПРИМЕЧАНИЕ: файлы mdrv в UNIDOS отлича─
ются от аналогичных файлов в GDOS. 

              SCREEN$ (тип 7)
             ---------------
   То  же, что  тип  4, при этом начальный
адрес=16384, длина=6912

              SPECIAL (тип 8)
             ---------------
211-255 На усмотрение программиста. 

           128K SNAPSHOT (тип 9)
          ---------------------
   Аналогично  48K  Snapshot. Первый  байт
файла - номер страницы (порт 0x7FFD), обы─
чно  лежащий  в системной переменной BANKM
(23388). 8  страниц ОЗУ сохраняются в воз─
растающем порядке - от 0 до 7.

             OPENTYPE (тип 10)
            -----------------
210     Число 64килобайтных блоков в файле 
211     Всегда 9? (нет уверенности) 
212-213 Длина последнего блока 
214-255 Не используется 
   ПРИМЕЧАНИЕ: Файлы  opentype  могут быть
больше 64K и обычно создаются и управляют─ 
ся потоковыми  операторами Бейсика, такими 
как  OPEN #,CLOSE #,PRINT #,INPUT # и т.п. 
См. главу [9] - краткое описание этих опе─ 
раторов. 

              EXECUTE (тип 11)
             ----------------
210-255 Как в файле CODE (тип 4), причём 
        длина=510, начальный адрес=0x1BD6
        (0x3DB6 для +D ). Сектор грузится
        в ОЗУ интерфейса и запускается (он
        должен содержать перемещаемую
        программу!).

        ПОДКАТАЛОГ (тип 12) - UNIDOS
       ----------------------------
210-212 Как в Opentype (тип 10). Этот файл 
        всегда хранится в последовательно
        расположенных секторах. Последние
        два байта сектора не хранят адрес
        следующего сектора. Структура
        аналогична корневой директории, но
        первая запись содержит номер заго─
        ловка файла (file header number)
        родительской директории. Последние
        два байта последнего сектора соде─
        ржат 0xFFFF.
/Непонятно,как система, работая с корневым 
каталогом,может наложить по ИЛИ s.a.b.всех 
файлов,включая лежащие в подкаталогах. Ве─ 
роятно,в s.a.b.подкаталога установлены би─ 
ты по всем файлам,которые есть в этом под─ 
каталоге. Но и в этом случае при изменении 
глубокого  подкаталога  придётся затратить 
много усилий: обновить s.a.b.'ы этого под─ 
каталога,его родителя, родителя родителя и 
т.д. - A.C./ 
 213     Ёмкость (максимальное число 
        записей в этом подкаталоге).

          CREATE (тип 13) - UNIDOS
         ------------------------
210-255 Аналогично файлу CODE, но 
        начальный адрес игнорируется.
 

          8. ТАБЛИЦА ТИПОВ ФАЙЛОВ
         =======================
   В  этой  таблице  перечислены различные
типы  файлов с соответствующими им иденти─
фикаторами (ID). Где возможно,указан испо─
льзуемый в ленточных заголовках (стандарт─
ный ПЗУ-шный) идентификатор  типа  файла -
сокращённо  ROM-ID. ROM-ID - часть 9-байт─
ного заголовка файла (байты 211-219 элеме─
 нта директории).
   ВНИМАНИЕ: в UNIDOS  к коду прибавляется
128 для скрытых файлов и 64 для защищённых 
файлов. 

 Код│         Тип          │надпись │ROM-ID 
   │                      │ в CAT  │
 ───┼──────────────────────┼────────┼────── 
  0 │удалён (пустая запись)│нет     │ нет
  1 │BASIC                 │BAS     │  0
  2 │NUMBER ARRAY          │D.ARRAY │  1
  3 │STRING ARRAY          │$.ARRAY │  2
  4 │CODE                  │CDE     │  3
  5 │48K SNAPSHOT          │SNP 48k │ нет
  6 │MICRODRIVE            │MD.FILE │ нет
  7 │SCREEN$               │SCREEN$ │ нет
  8 │SPECIAL               │SPECIAL │ нет
 9 │128K SNAPSHOT         │SNP 128k│ нет
10 │OPENTYPE              │OPENTYPE│ нет 
11 │EXECUTE               │EXECUTE │ нет 
12 │ (UNIDOS) подкаталог  │DIR     │ нет 
13 │ (UNIDOS) CREATE      │CREATE  │ нет 
   9. ДОПОЛНИТЕЛЬНЫЕ КОМАНДЫ БЕЙСИКА GDOS
  ======================================
   GDOS  расширяет Бейсик, чтобы организо─
вать дисковые операции. Когда вы включаете
Spectrum, вы  должны инициализировать сис─
тему; для  этого вставьте диск, содержащий
файл   операционной  системы  ( "SYS*"  на
DISCiPLE  и "+SYS*" для +D ),в первый дис─ 
ковод и введите "RUN". ДОС,кроме того,ищет
первый файл под названием "auto*" и запус─
кает  его, если  находит. Файл  "auto*" не
 ищется, если введена команда "RUN boot".
   ПРИМЕЧАНИЕ: Имена файлов  чувствительны
к  регистру  и  могут  содержать wildcards 
('*' и '?'). 
    Чтобы увидеть содержимое диска,введите:
         CAT 1 (для дисковода 1)     или
        CAT * (текущий дисковод)
   Можете  также вводить команды наподобие
 таких:
         CAT 1;"a*"
         CAT #3;1;"sys*"
         CAT 1!
        CAT #3;1!
отсюда понятно,что вы можете перенаправить
текст каталога в любой канал и можете ука─
зать  имя  файла, которое  может содержать
wildcards, если  вы хотите показать только
подходящие  под  маску файлы. Если команда
оканчивается на '!',то показывается сокра─
щёный  каталог, содержащий  только  список
(подходящих) имён файлов.
    Чтобы загрузить/записать файл:
        LOAD d<dn>;"filename"
 [CODE|SCREEN$|DATA|и т.д.] 
         LOAD p<fn>
        SAVE d<dn>;"program"
 [CODE|LINE|SCREEN$|и т.д.] 
         где <dn> - номер дисковода (1-2)
            <fn> - номер файла (1-80)
Вы должны указать тип 'S' для загрузки 48K
snapshot  и 'K' для 128K snapshot. Регистр
букв 'S' и 'K' важен.
    Примеры:
  LOAD d1;"screen" SCREEN$
  LOAD d*;"pippo"   грузит с тек. дисковода
  LOAD d1;"snap128"K   грузит 128K snapshot
  SAVE d2;"rom" CODE 0,16384
                 сохраняет память DISCiPLE!
   ПРИМЕЧАНИЕ:  "d1" со строчным 'd' отно─
сится к DS DD дискам (80 дорожек, 2 сторо─ 
ны); в ПЗУ версии 3 единственное различие, 
кажется,в том,что если вы используете 'D', 
то после операции выполняется команда CAT. 
Ранние версии ОС использовали "D1" (загла─ 
вное  'D')  для  односторонних дисков. Это 
относится  ко  всем случаям, где вы должны 
указать  поле  'd<dn>'. Используйте только 
DS/DD диски. 
   При  сохранении  файлов CODE можно ука─
 зать адрес автозапуска в 3-ем параметре:
 SAVE d*;"runme" CODE 32768, 8192, 33000
если  вы  загрузите его обратно через LOAD
CODE,  он  сам  запустится  как  будто  по 
RANDOMIZE USR 33000. 
   Каждый файл может быть адресован как по
имени, так  и по номеру в директории; если
файл "screen" лежит  в 7-м элементе дирек─
 тории, вы можете писать:
 LOAD p7
Обратите внимание, что если вы используете
сокращённую запись, каждый файл будет заг─
ружен в соответствии со своим типом (т. е.
вы можете загрузить файл CODE по его нача─
льному адресу).
   Естественно, MERGE  и VERIFY имеют ана─
логичный синтаксис.
    Чтобы удалить файл с диска, введите:
  ERASE d1;"file2del"
 ERASE d1;"*"                      опасно!
   Команда  ERASE  может быть использована
 для переименования файла:
 ERASE d1;"oldname" TO "newname"
    Для форматирования диска введите:
 FORMAT d1  двойн.плотность (250 Kbit/sec)
 или
 FORMAT sd1            одинарная плотность
   GDOS  также  расширяет систему потоков,
благодаря чему вы можете перенаправить по─
ток в файл и наоборот. Когда вы открываете
канал для записи в файл,создаётся файл ти─
па OPENTYPE. Файлы opentype могут быть бо─
льше 64K.Каналы доступны через обычные ко─
 манды PRINT,INPUT,INKEY$ и т.д. Примеры:
  OPEN #4;d1;"archive"
  OPEN #5;d1;"temp" OUT  открыть для записи
  OPEN #5;d1;"temp" IN   открыть для чтения
  MOVE #3 TO #4
  MOVE #4 TO d1;"temp1"
  MOVE d1;"temp2" TO #4
 CLOSE #4
   Обратите внимание, что каналы доступа к
диску  буферизированы, и  данные читаются/
пишутся  на  диск только когда 512-байтный
буфер  пуст/полон. При  доступе  к  файлам
BASIC, CODE, DATA  и  SCREEN$ через потоки
помните,что эти файлы начинаются с 9-байт─
ного заголовка, а настоящие  данные идут с
10-го байта.
   Чтобы  скопировать  один файл в другой,
 пишите:
 SAVE d1;"file1" TO d2;"file2"
Поскольку  команда  SAVE TO использует всё
свободное ОЗУ,то по её завершении происхо─
дит сброс системы.
   Вы можете загружать/сохранять отдельные
 секторы следующими командами:
  LOAD @d,t,s,address
 SAVE @d,t,s,address
 где 'd' - номер дисковода (1 или 2) 
     't' - номер сектора (0..79
           плюс 128, если сторона 1)
     's' - номер сектора (1..10)
     'address' - адрес 512-байтного буфера
                под сектор
   Например,вы можете прочитать первый се─
ктор  диска  (который содержит дескрипторы
номер 0 и 1) через LOAD @1,0,1,40000.
   DISCiPLE GDOS понимает синтаксис микро─
драйва, так  что вы можете вводить команды
 наподобие такой:
 LOAD *"m";1;"pippo"
она  будет загружать бейсик-прогрмму pippo
с дисковода 1. Все ваши программы для мик─
родрайва будут работать под GDOS без изме─
нений. Помните, что  PlusD не поддерживает
синтаксис Интерфейса 1 (IF1).

                  9.1 СЕТЬ
                 ========
   GDOS (DISCiPLE) поддерживает сеть, сов─
местимую с Interface 1, с некоторыми улуч─
шениями. Вместе может быть соединено до 63
Spectrum'ов, и  они  могут  разделять свои
ресурсы  (файлы  и  принтеры) через кабель
3.5mm mono jack. Каждая  станция  получает
уникальный номер от 1 до 63. Номер станции
 присваивается командой:
 FORMAT Ns
где 's' - номер станции (1-63). 
Эта команда может быть введена даже тогда,
когда не загружен файл системы (т.е. когда
система not booted).
   Станция  номер  0  зарезервирована  для
вещания  (broadcasting). Если  вы  введёте
FORMAT N0, сеть выключится; введите FORMAT 
Ns, чтобы включить её. 
   Номера станций делятся на 4 класса:
Номер │          Назначение 
 ──────┼─────────────────────────────────── 
     0 │Вещание (Broadcasting)
     1 │Главная станция (Master station)
  2-9 │Ассистенты (загружают файл системы)
 10-63 │Ученики (pupils) или ассистенты 
      │(ученики не загружают файл системы)
   Возможны следующие конфигурации сети:

      1. Сеть с разделённым доступом
           (Shared Access Network)
      ------------------------------
   В  этой  модели  станция  номер 1 имеет
свои ресурсы (дисководы и принтер) и рабо─
тает как master. Остальные станции называ─
ются  учениками, имеют  доступ к файлам на
дисках  master'а и могут печатать на прин─
тере master'а. Только master должен загру─
жать  файл  системы. Поскольку  ученики не
должны  грузить файл системы, они получают
номера  от  10 и выше. Если вы попытаетесь
ввести  FORMAT N8,  не  загрузив  систему,
вы  получите  сообщение  'Invalid  station
number'. 
   Мастер  может послать файл "pippo" уче─
 нику номер 16 следующим образом:
  LOAD d1;"pippo"      сначала грузим файл,
           в данном случае бейсик-программу
 SAVE N16           послать его станции 16
Конечно, вы  можете  посылать  файлы CODE,
SCREEN$ и т.д. тоже!
   Вы  можете  послать файл всем станциям,
 используя broadcast:
 SAVE N0                      послать всем
Станция  6  может  получить  программу  от
 master'а, если введёт:
 LOAD N1   принять от станции 1 (master'а)
Каждая  станция  может  получить broadcast
 сообщение следующим образом:
 LOAD N0
Ученики  тоже могут посылать broadcast со─
общения через SAVE N0  и могут связываться
с другими учениками таким же способом.
   Самое  интересное, что ученик может за─
лезть на диск и вводить команды, как будто
дисководы  и принтер подключены к его ком─
пьютеру. Так, станция номер 6 может прочи─
тать каталог диска master'а обычной коман─
 дой:
 CAT d1
 и загрузить файл "pippo" командой:
 LOAD d1;"pippo"
   Естественно, ученики могут также сохра─
нять  файлы на диск master'а и могут испо─
льзовать  его  принтер  обычными командами
LLIST, LPRINT или COPY SCREEN$ 
   Master  может форсировать передачу дан─
ных  на станцию ученика и обратно. Если вы
 введёте на master'е:
 LOAD F4 SCREEN$
то Spectrum номер 4 остановится и передаст
свой текущий экран master'у, который может
таким  образом  видеть, что  происходит на
станции 4. Аналогичным  образом  вы можете
 ввести:
 SAVE F8
чтобы  заставить станцию номер 8 загрузить
бейсик-программу, загруженную на master'е.
Опять-таки, все  варианты команд LOAD/SAVE
работоспособны (CODE, SCREEN$...).
   Конечно, master может использовать сис─
тему как обычно.

       2. Сеть независимых станций
       (Independent Station Network)
       ---------------------------
   Похоже  на предыдущую модель, но каждая
станция имеет собственные дисководы и при─
нтер.Естественно,все станции в этом случае
должны  загрузить  файл  системы,  команда
FORMAT должна быть выполнена после этого. 
   Например, станция 4 может послать кодо─
 вый блок станции 3 через:
 SAVE N3 CODE 32768,16384
 и станция 3 получит его через:
 LOAD N4 CODE
   Вы  можете использовать станцию номер 0
для broadcasting.
   Обратите внимание, что станция master в
предыдущей  модели - независимая  станция.
   Важное  замечание: только станции номер
1 - 10 могут  быть независимыми. Станции 2
- 10 называются ассистентами (работают как
master,но не могут вводить команды SAVE F-
и LOAD F- ).

            3. Смешанная сеть
              (Mixed Network)
            -----------------
   Можно иметь сеть, включающую как учени─
ков, так  и независимые станции - при этом
станции учеников не имеют своих дисководов
и принтеров. Так можно иметь больше одного
master'а.

            9.2. КНОПКА SNAPSHOT
           ====================
   Когда  вы  нажимаете магическую кнопку,
генерируется  NMI  и управление передаётся
на  адрес  0x0066 ( 102 десятичное) памяти
DISCiPLE/+D. Последующее поведение системы 
зависит  от конкретной загруженной версии.
Под стандартными системами (например, сис─
темами  3a/3b/3d)  вы  должны держать CAPS
SHIFT  во  время  нажатия кнопки, тогда на 
бордюре  появятся цветные полоски и станут
 доступны 5 клавиш:
   1 = Вывести экран на принтер
   2 = Большая распечатка (A4)
   3 = Записать текущий экран на диск
   4 = Записать 48K snapshot
  5 = Записать 128K snapshot.
   Снапшоты  сохраняются на диск с именами
типа "Snap A" и последующих индексов,зави─
сящих от позиции в каталоге.При сохранении
128K снапшота система останавливается пос─
ле создания файла и ждёт,пока пользователь
не сообщит,изменился ли экран после опера─
ции; пользователь должен ответить нажатием
'y' или 'n'. Это происходит из-за того,что 
DISCiPLE  и +D, в отличие от Multiface, не 
имеют  триггера  для  сохранения состояния
бита 3 порта 0x7FFD, который указывает,ка─
кой  экран  отображается. Перед  ожиданием
вмешательства пользователя система включа─
ет первый экран (0x4000),так что если изо─
бражение  изменилось, то это означает, что
раньше был включен второй экран.
   После   этого  управление  возвращается
 прерванной программе.
   ПРИМЕЧАНИЕ: Процедура  snapshot  портит
стек шестью байтами (PC,AF и R+F). Это мо─ 
жет  нарушить  работу  некоторых программ, 
которые  используют стек нестандартным об─ 
разом (например, Batman the Movie ).Подро─ 
бнее  см. раздел  snapshot (тип файла 5) в 
 главе [7]. 
   ПРИМЕЧАНИЕ: Функция  snapshot  не может
быть использована во время работы сети. 
 

  9.3. СООБЩЕНИЯ ОБ ОШИБКАХ GDOS и UNIDOS
 =======================================
   Приводим список кодов ошибки, доступных
через RST 20h, для обеих систем.

Код      GDOS                  G+DOS 
00 Nonsense in GDOS      Nonsense in G+DOS 
01           Nonsense in GNOS 
02           Statement END error 
03           BREAK requested 
04           SECTOR error 
05           FORMAT data lost 
06 NO DISC in drive    CHECK DISC in drive 
07 No "SYSTEM" file      NO "+SYS  " file 
08           Invalid FILE NAME 
09           Invalid STATION 
10           Invalid DEVICE 
11           VARIABLE not found 
12           VERIFY failed 
13           Wrong FILE type 
14           MERGE error 
15           CODE error 
16           PUPIL set 
17           Invalid CODE 
18           Reading a WRITE file 
19           Writing a READ file 
20 O.K. GDOS 3           O.K. G+DOS 
21           Network OFF 
22           Wrong DRIVE 
23           Disc write PROTECTED 
24           Not enough SPACE on disc 
25           Directory FULL 
26           File NOT FOUND 
27           END of file 
28           File NAME used 
29 Not a MASTER station  NO G+DOS loaded 
30           STREAM used 
31           CHANNEL used 

Код          UNIDOS 
128    Nonsense in Uni-Dos 
129    O.K Uni-Dos 
130    Break requested 
131    Corrupt sector 
132    Sector missing 
133    Check disc in drive 
134    DOS file not found 
135    Invalid filename 
136    Invalid sector number 
137    Invalid device/channel 
138    Wrong stream type 
139    Verification failed 
140    Wrong file type 
141    CODE parameter error 
142    Directory not found 
143    File has zero length 
144    Reading a write file 
145    Writing a read file 
146    POINT outside file 
147    Channel out of order 
148    Illegal drive number 
149    Disc write protected 
150    Not enough disc space 
151    Directory full 
152    File not found 
153    End of file 
154    Filename already used 
155    File still open 
156    File in use 
157    Channel already open 
158    Protected file 
159    Unavailable RST 8 
 

   10. СИСТЕМНЫЕ ПЕРЕМЕННЫЕ GDOS и UNIDOS
  ======================================
   Системные  перменные GDOS и UNIDOS хра─
нятся  в ОЗУ интерфейса и могут быть изме─
 нены командой POKE следующего вида:
 POKE @var, value
 где   var - номер переменной 
    value - новое значение переменной.
   Фактически  оператор '@' понимается как
смещение  в ОЗУ интерфейса. Базовые адреса
 следующие:
  0x2000 UNIDOS и G+DOS (+D)
 0x0298 GDOS (DISCiPLE)

       Список системных переменных:
 Номер            Описание 
   0  Мигать бордюром во время дисковых
      операций. Установите в 0,чтобы бордюр
      не менялся. Это байт накладывается по
      И на номер сектора,результат кидается
      в порт 0xFE.
   1  Ёмкость диска 1 = число дорожек плюс
      128, если две стороны.
   2  Ёмкость диска 2, аналогично.
   3  Скорость перемещения головки
      дисковода. 1 = минимальная (1 ms).
      ВНИМАНИЕ: Запись сюда нуля может
      заблокировать дисковод. Он может быть
      разблокирован при реинсталляции ОС с
      ленты.
   4  GDOS: запретить принтерный порт
      Centronics (0=разрешён)
      UNIDOS: если установлено, разрешает
      кнопку BREAK.
   5  Длина строки принтера в символах (по
      умолчанию 80)
   6  Флаг управления принтером. Если
      установлен, то коды, посылаемые на
      принтер, не фильтруются (двоичный
      вывод = binary output). Нужно для
      пересылки контрольных кодов на
      принтер.
   7  Расстояние между строками на
      принтере, измеренное в 1/72 долях
      дюйма. Посылается на принтер перед
      каждым возвратом каретки (CR) (по
      умолчанию: GDOS=12, UNIDOS=8).
   8  Число переводов строки после CR (по
      умолчанию: GDOS=1, UNIDOS=0).
   9  Левая граница при печати. Это число
      пробелов, вставляемых перед первым
      символом строки (по умолчанию = 0).
  10  Флаг принтера.
      GDOS: есть установлено, драйвер
      принтера генерирует графическое
      представление символов фунта и
      копирайта /не уверен, что именно эти,
      т.к. символы в тексте были запорчены.
      - A.C./ (по умолчанию равно 1).
      UNIDOS: флаг принтера (по умолчанию
      0x80).
  11  GDOS: номер станции сети (по
      умолчанию 1).
      UNIDOS: разрешает Centronics,
      аналогично переменной #4 GDOS'а (по
      умолчанию 1).
  12  UNIDOS: номер колонки принтера (по
      умолчанию 1).
  13  UNIDOS: цвет экрана CLS#.
  14  Адрес расширенного синтаксиса (2
      байта). Этот адрес вызывается при
      возникновении ошибки, которая не
      относится к hook codes и синтаксису
      ДОС. Может быть использован для
      добавления новых команд.
      Игнорируется, если 0.
  16  UNIDOS: адрес обработчика прерываний
      (Interrupt address) (2 байта).
  18  UNIDOS: коды инициализации принтера
      (8 байт). Посылаются на принтер после
      NEW или перед нажатием кнопки 'P' во
      время snapshot'а.
  26  UNIDOS: установка высоты символа (8
      байт).
  34  UNIDOS: установка межстрочного
      расстояния n/72 дюйма (8 байт).
  42  UNIDOS: установка плотности графики
      символов UDG (8 байт).
  50  UNIDOS: дополнительные коды
      инициализации (Second initialise
      codes) (8 байт).
  58  UNIDOS: коды для знака фунта (8 байт)
  66  UNIDOS: коды для знака '#' (8 байт)
  74  UNIDOS: коды для знака (c) (8 байт)
  82  UNIDOS: сохраняет 2 параметра SCREEN$
      (Save SCREEN$ 2 parameters) (7 байт).
  89  UNIDOS: установка графического режима
      (set dump graphics) (8 байт).
  97  UNIDOS: адрес дополнительных сообще─
      ний об ошибках (по умолчанию 0x1C68).
 99  UNIDOS: код ошибки.
 100  UNIDOS: адрес процедуры LPRINT (по 
     умолчанию 0x34AA).
 102  UNIDOS: адрес возврата по ошибке ДОС 
     (по умолчанию 0x0000).
 104  UNIDOS: рабочая область snapshot'а 
     (20 байт).
 124  UNIDOS: вызывается по сбросу (по 
     умолчанию 0x0000).
 126  UNIDOS: вызывается при загрузке (по 
     умолчанию 0x21A4).
 7667 UNIDOS: запишите сюда 0 для сброса 
     ДОС.
11. ДОПОЛНИТЕЛЬНЫЕ КОМАНДЫ БЕЙСИКА UNIDOS 
========================================= 
   UNIDOS - продвинутая  операционная сис─
тема, работающая на  DISCiPLE и  на PlusD. 
Распространяется  в виде EPROM, различных
для  этих  двух интерфейсов. Замените этим
EPROM'ом микросхему ПЗУ GDOS. Вам потребу─
ется системный диск,содержащий резидентную
часть  ДОС  -  файл "Uni-Dos", запускаемый
командой  RUN  после включения компьютера.
Системный  файл одинаковый  для DISCiPLE и
+D (отсюда,полагаем,название UNI-DOS ). Он 
имеет длину 6654 байт; "пропавшие" 2 байта
содержат  контрольную сумму, которая часто
проверяется ДОСом,чтобы обнаружить повреж─
дение системы.Этот механизм работает дово─
льно  хорошо, и иногда вы можете заметить,
что системный файл перезагружается без яв─
ного на то указания:не волнуйтесь! :) Пом─
ните,что в DISCiPLE адреса ОЗУ и ПЗУ пере─
ставляются UNIDOS'ом. См.главы [2], [3.1].
   Главные особенности UNIDOS - мощная си─
стема  подкаталогов, отличные средства пе─
чати и ещё много профессиональных штрихов,
которые найдёте во время использования.
   UNIDOS  поддерживает  набор стандартных
функций  GDOS  и G+DOS (некоторые, однако,
были изменены) - см. о них соответствующую
главу. Кое-что отсутствует,в частности,се─
тевые процедуры - под них не хватило памя─
ти. Оператора  FORMAT  теперь нет в наборе
команд,эта операция производится специаль─
ной программой,лежащей на системном диске.
   Файлы   имеют   два  атрибута:  скрытый
(hidden) и защищённый (protected). Скрытые
файлы не показываются в каталоге, защищён─
ные файлы недоступны для записи.Диск полу─
чает  имя (строку, содержащую до 10 симво─
лов) во время форматирования.
   В UNIDOS появились ПОДКАТАЛОГИ. Они ра─
ботают именно так, как вы ожидаете; можете
 указывать имя файла с полным путём к нему:
 "/dir1/dir2/file"
Заметьте, что  косая черта (slash) '/' ис─
пользуется для разделения имён директорий,
как в Unix. Пути могут быть относительными
(от  текущей  директории)  или абсолютными
(т.е. относительными от корня,начинаются с
'/'). Нет  ограничения  на  глубину дерева
директорий. Корневая директория имеет фик─
сированную ёмкость на 80 файловых записей,
а  подкаталоги  могут  иметь любую ёмкость
/Не больше 256 файлов - см. хэндл.- A.C./. 
Если  строка оканчивается косой чертой, то
это имя директории.Специальные имена дире─
кторий  "."  и ".." указывают на текущую и
родительскую директорию.
    Эквивалент команды 'cd' (change dir):
 IN d1;"pathname/"
с косой чертой в конце пути (т.к. это дол─
жно быть имя директории);эта команда выби─
рает  текущую  директорию и текущий диско─
вод.Вы также можете использовать IN просто
для выбора текущего дисковода,если не вве─
дёте путь и точку с запятой.
   Нет  стандартных команд создания и уда─
ления директорий.См.ниже про файлы CREATE.
   Операторы  LOAD  и  SAVE не изменились;
появилась дополнительная сокращённая форма
 для LOAD (для MERGE и VERIFY тоже):
 LOAD p"filename"
которая загружает "filename" с тек. диска.
   Исполняемые файлы (EXECUTE files) могут
 быть запущены через:
 LOAD d1;"exe"X, <address>
   В операторе SAVE вы можете указать клю─
чевое слово OVER, которое отключает прове─
 рку на перезапись:
 SAVE OVER d1;"program"
Эта  команда  перезапишет файл без запроса
на подтверждение.
   Команда  ERASE  не менялась. Если после
оператора ERASE добавлено NOT, то не выво─
дятся  сообщения  об ошибках. Вы не можете
удалить файл,если он в данное время открыт
или если он защищён.
    Оператор CAT имеет новую форму:
  CAT d1
 CAT d1;"pathname"
Вы  должны  теперь  указывать  'd1' вместо
'1', как  в GDOS. Все варианты, принятые в
GDOS, разрешены.Если вы добавите NOT после 
CAT, в списке будут  и скрытые файлы. Если 
вы укажете имя директории, CAT покажет со─
держимое директории.
   Теперь  возможно  слияние (MERGE) и для
кодовых файлов,но единственный эффект про─
является в том, что убирается автозапуск.
   Оператор MOVE работает как обычно (раз─
решён OVER ) и может теперь использоваться
для копирования одного файла в другой, за─
 меняя старый SAVE TO таким способом:
  MOVE [OVER] d1;"file1" TO d2;"file2"
 MOVE [OVER] d1;"file1" TO "file2"
MOVE может копировать файлы snapshot, MDRV 
и opentype,даже длиннее,чем 64K. Оно может
копировать  подкаталоги, если  указан путь
(оканчивающийся  на  '/'). MOVE, в отличие
от SAVE TO, использует только память между
бейсиком и машинным стеком,поэтому не тре─
бует сброса системы после завершения.
   Команда  CLS  может  использоваться для
сброса экранных цветов в состояние,лежащее
 в системной переменной 13:
 CLS #
   В  UNIDOS  появляется  мощное  средство
- ФАЙЛЫ  С  ПРОИЗВОЛЬНЫМ  ДОСТУПОМ (RANDOM
ACCESS FILES), т. е. файлы  OPENTYPE могут
обрабатываться любым способом, а не только
подряд. Для  открытия файла с произвольным
доступом  используется  оператор  OPEN # в
 следующем виде:
 OPEN #4;d1;"file" RND
   Если  вы укажете IN вместо RND, то файл
будет доступен только для чтения,но тоже с
произвольным  доступом. К одному файлу од─
новременно может быть подключено до 16 ка─
 налов. Такой оператор:
 OPEN #4;d1;"file" RND <length>[,<byte>]
создаёт  файл  указанной длины и заполняет
его указанным байтом (если он указан!). Не
забудьте  закрыть  или очистить все каналы
перед  тем, как  вынуть диск из дисковода,
иначе после смены диска при попытке выпол─
нить команды ДОС будут выдаваться ошибки.
   Вы  можете  работать  с  каналами через
обычные  команды  PRINT, INPUT и INKEY$ во
 всех вариантах. Доступны и новые команды:
 POINT #4, <offset>
установит  указатель  файла  на  указанное
смещение  в файле с произвольным доступом,
подключенном  к каналу #4. При пересечении
границ файла выдаётся ошибка.
    Оператор CLEAR теперь имеет две формы:
  CLEAR #
 CLEAR #*[<channel>]
Первый  очищает  все  каналы  без создания
openout файла,последний закрывает один или
все дисковые каналы, создавая openout файл
(? - A.C.)  и опустошая  буферы. Вы можете 
отдельно опустошить (flush) буферы,без за─
 крытия файла:
 OUT #<channel>
   Как  мы  говорили выше, в UNIDOS особое
внимание  уделено ПЕЧАТИ. Команды LPRINT и
LLIST работают как обычно, но теперь пере─ 
направлены  на параллельный порт интерфей─
 са.Можете сделать распечатку экрана через:
 SAVE SCREEN$ 1   или   SAVE SCREEN$ 2
   Эти  2 варианта имеют раздельные наборы
параметров. 2-й режим может быть переопре─
делён пользователем через изменение систе─
мных переменных. Эти процедуры также вызы─
ваются  снапшотными  клавишами  '1'  и '2'
 (см.ниже). Общая форма SAVE SCREEN$:
 SAVE SCREEN$ #flag [,pass [,margin [,y
[,x [,h [,w]]]]]] 
 где flag = горизонтальное увеличение (0-7) 
        + 8*вертикальное увеличение (0-7) +
        + 64 для преобразования цветов +
        + 128 для печати боком.
            Увеличение 0 означает 8.
     pass = число проходов при печати одной
            линии
   margin = левая граница в символах
    y и x = лев.верх.угол печатаемого окна
   w и h = ширина, высота печатаемого окна
Подробнее см. системные переменные.
   Следующий  полезный  оператор реализует
 механизм ON ERROR GOTO:
 LINE 9000
включает перехват ошибок; все ошибки,кроме
OK, STOP и BREAK, перехватываются,при этом
управление передаётся указанной строке,где
программа  может  определить  тип  ошибки,
 прочитав системную переменную 99 через
 (PEEK @99).
   UNIDOS  также  реализует  новые ФУНКЦИИ
Бейсика; они заключаются в скобки,т.е. пи─
 шутся в виде (<function>). Мы уже видели:
  (PEEK @offset)
которая читает системную переменную (в об─
щем случае ОЗУ по адресу offset+8192).
   Длину   канала   произвольного  доступа
 (random channel) можно узнать через:
 (LEN #<channel>)
 при этом:
 (POINT #<channel>)
возвращает  текущее  смещение  указателя в
файле или 0, если мы в конце файла (EOF).
   Указанное  число байтов может быть про─
 читано из любого канала через:
 (IN #<channel>, <length>)
Ещё  вы можете проверить наличие файла или
 директории через:
 AT d1;"pathname"
что возвращает 0, если файл не существует,
или номер его директории, если он найден.
   Появился   новый   тип   файлов - файлы
CREATE. Это  программы  в  машинных  кодах
(обычно  новые команды или расширения син─
таксиса), которые загружаются между облас─
тью каналов и областью Бейсика,поэтому они
теряются  после  NEW или сброса. Вы можете
 загружать и сохранять файлы create через:
  LOAD d1;"pathname" USR
 SAVE d1;"pathname" USR <address>,<length>
Вы можете загружать столько create файлов,
сколько  поместится  в  памяти.  Системный
диск, прилагаемый  к  UNIDOS, содержит два
create файла со следующими доп. функциями:
            "ext_code" содержит:
 FORMAT d1;"diskname"
для форматирования дисков.Имя диска сохра─
няется в последних байтах первого элемента
 корневой директории.
 (LINE)
возвращает номер текущего дисковода + 128,
если диск защищён от записи;значение имеет
 обратный знак,если в дисководе нет диска.
 (STR$ #<channel>)
возвращает пустую строку,если канал не от─
крыт, или 'd', если это openout поток, или
'D', если  это поток с произвольным досту─
пом, или букву, которую использует канал.
            "dir_code" содержит:
 SAVE [OVER] d1;"dirname" CAT <capacity>
создаёт  директорию  ёмкостью  в указанное
 число файлов.
 ERASE d1;"dirname" CAT
 удаляет указанную директорию.
 (STEP [d<drive])
возвращает  последнюю  использованную  или
текущую (если указан drive) директорию.
   Теперь  немного  о SNAPSHOT'е. Активные
клавиши те же,что и в GDOS, с теми же фун─
кциями,плюс кнопка 'x' для возврата в пре─
рванную  программу и 'p' для посылки кодов
инициализации  на  принтер. Если  во время
сохранения  снапшота  происходит  какая-то
ошибка, то  управление возвращается в меню
snapshot, а не в прерванную программу.
   Обратите внимание:на +D кнопка snapshot
не работает при выполнении команд ДОС.
 

          12. РАСПИНОВКИ РАЗЪЁМОВ
         =======================
   Вид с задней стороны интерфейса.
              DISC CONNECTOR
  ┌─33─────────────────────────────3─1─┐
  │  o o o o o o o o o o o o o o o o o │
  │  o o o o o o o o o o o o o o o o o │
  └─34─────────────────────────────4─2─┘
 1-33 Ground (0V)   22 Write data 
    8 Index         24 Write gate
   10 Disk1 select  26 Track00
   12 Disk2 select  28 Write protect
   16 Motor on      30 Read data
   18 Step dir.     32 Side select
  20 Step pulse
             PRINTER CONNECTOR
      ┌─25─────────────────────3─1─┐
      │  o o o o o o o o o o o o o │
      │  o o o o o o o o o o o o o │
       └─26─────────────────────4─2─┘
    1 Strobe        13 D5
    3 D0            15 D6
    5 D1            17 D7
    7 D2            21 Busy (input)
    9 D3          2-22 Grounds (0V)
  11 D4
   Распиновка параллельного интерфейса по─
зволяет  реализовать  прямое  соединение с
разъёмом Centronics через плоский кабель.
 

    12.1. ПОДКЛЮЧЕНИЕ ДИСКОВОДА PC 5.25"
   ====================================
   Petri Andras  прислал  интересный доку─
мент о подсоединении  обычного  5.25" (1.2
MB)  PC дисковода к DISCiPLE и +D. Хотя не
все дисководы  можно  подключить, шансы на
успех  довольно  высоки; вы можете решить,
будет  ли работать ваш дисковод, с помощью
простого теста, описанного ниже.
   Процедура требует некоторого опыта, так
что лучше попросить вашего друга-эксперта,
если вы не знакомы с такими операциями.Бу─
дьте осторожны,мы не несём ответственность
 за любые повреждения вашей системы.
   ПРОВЕРКА СОВМЕСТИМОСТИ. Дисковод должен
уметь работать в режиме "low density". Это
решающий вопрос,т.к. DISCiPLE рассчитан на
определённую скорость вращения (RPM - обо─
роты в минуту) привода; PC-шный контроллер
дисководов,однако,поддерживает разные пло─
тности  записи без изменения скорости вра─
щения, просто  перепрограммируя свою внут─
реннюю  частоту.  Поэтому  многие  PC-шные
дисководы, особенно новые, не поддерживают
смену скорости вообще.Существует сигнал на
интерфейсе для переключения RPM (Pin 2),но
 дисковод может игнорировать его.
   Тест: подключите  питание  к  дисководу
при  отключенном  плоском кабеле, вставьте
дискету, поставьте jumper на DS0, как ука─
зано  ниже, замкните pins 11-12 и 15-16 (с
помощью  закрепления на разъёме двух пере─
мычек с "крокодилами"). Лампочка дисковода
загорится, и вы услышите  вращение мотора.
Возьмите  третью перемычку и замкните pins
1 и 2.Если RPM изменится (различие заметно
на слух),дисковод подходит.Если нет,отклю─
чите  питание, возьмите мультиметр и ищите
jumper,подключённый к pin 2.Если вам пове─
зёт,вы его найдёте; поставьте его в другое
 положение и проведите проверку снова.
   ПРОЦЕДУРА. Дисковод должен быть подклю─
чён к тому разъёму на PC-шном шлейфе,кото─
рый ДО перехлёста проводов (где на PC под─
ключается  дисковод B: ). Если шлейф имеет
разъём 5.25" только  после перехлёста (та─
ковы новые PC-шные шлейфы), то разъём надо
снять со шлейфа,перевернуть провода обрат─
но  и  потом  вернуть разъём на шлейф. Эта
операция  требует  сноровки, но  настоящий
Speccy hacker определённо её имеет ;-)
   Где-то  в  недрах дисковода должен быть
набор из 4 jumper'ов, подписанных DS0,DS1,
DS2,DS3 (или как-нибудь в этом роде,с циф─
рами от 0 до 3). Jumper ВСЕГДА в положении
DS1 на PC-шных дисководах. Его надо перес─
тавить на DS0, чтобы использовать дисковод
в качестве Disk 1 на DISCiPLE.(Если jumper
 на DS1, то дисковод работает как Disk 2).
   Технические  подробности:  Этот  jumper
выбирает  ту  линию  Drive Select, которая
активирует дисковод. Оригинальный дисковый
интерфейс   Tandon/Shugart  поддерживал  4
линии  Drive  Select  и  общую линию Motor
Enable. PC-шный дисковый интерфейс исполь─
зует  DS1 и Motor Enable для выбора и вкл.
мотора дисковода A,а DS0 и DS2 - то же для
дисковода B. Перехлёст  в шлейфе позволяет
ставить jumpers на 2 дисководах одинаково.
 

        13. ПРОГРАММИРОВАНИЕ VL1772
       ===========================
   Приводим низкоуровневую техническую ин─
формацию про VL1772 floppy disk controller
(FDC).  Эту   микросхему   используют  MGT
DISCiPLE,   MGT PLUS D,   MGT SAM COUPE  и 
ATARI ST. Кажется, он  почти  совместим  с 
FDC 1791 и 1793. Адреса портов для регист─
ров FDC в DISCiPLE и +D см. в разделе 3.
   (W) - запись, (R) - чтение.

            РЕГИСТР КОМАНД (W)
   Команды делятся на 4 класса.Смысл млад─
ших  4  битов  командного байта зависит от
класса  команды; вы  должны наложить их по
ИЛИ на код команды, данный ниже.
              Команды типа 1:
              ---------------
  b0-b1 = Скорость перемещения головки
          00=6ms; 01=12ms; 10=20ms; 11=30ms
      b2 = Проверять номер дорожки
     b3 = Load/unload (опускать/поднимать)
          головку в начале операции
Имя команды   Код       Примечания 
 RESTORE       0x00 Вернуть головку на 0-й 
                   трек
 SEEK          0x10 Искать дорожку 
                    посылайте её номер в
                   регистр данных)
 STEP_NUPD     0x20 Шаг в текущем 
                    направлении без
                   изменения рег. дорожки
STEP_UPD      0x30 Шаг в тек. направлении 
 STEP_IN_NUPD  0x40 Шаг к центру без 
                    инкрементирования
                   регистра дорожки
STEP_IN_UPD   0x50 Шаг к центру 
 STEP_OUT_NUPD 0x60 Шаг от центра без 
                    декрементирования
                   регистра дорожки
STEP_OUT_UPD  0x70 Шаг от центра 

              Команды типа 2:
              ---------------
     b0 = f8 (удалённый dam) / fb (dam),
          если установлено в командах READ
/У Ларченко и Родионова наоборот:  "Обычно 
этот бит обнуляют, при этом в поле заголо─ 
вка  сектора  формируется специальный байт 
 #FB,в противном случае - байт #F8".- A.C./ 
      b1 = Проверять номер стороны
      b2 = Задержка 15 ms
     b3 = Номер стороны для сравнения
Имя команды   Код       Примечания 
READ_1SECTOR  0x80 Прочитать один сектор 
READ_MSECTOR  0x90 Прочитать неск.секторов 
WRITE_1SECTOR 0xA0 Записать один сектор 
WRITE_MSECTOR 0xB0 Записать неск.секторов 

              Команды типа 3:
              ---------------
   b0-b1 = 0
      b2 = Задержка 15 ms
     b3 = 0
Имя команды   Код       Примечания 
 READ_ADDRESS  0xC0 Прочитать адрес. 
                    Контроллер читает
                    заголовок первого
                    попавшегося сектора и
                    возвращает 6 байт:
                    номер дорожки,
                    номер стороны,
                    номер сектора,
                    размер сектора
                   и 2-байтную контр.сумму
 READ_TRACK    0xE0 Прочитать всю дорожку 
                    (включая заголовки и
                   управляющие коды)
 WRITE_TRACK   0xF0 Записать всю дорожку 
                    (используется для
                   форматирования дорожки)

              Команды типа 4:
              ---------------
     b0 = Появление готовности (Not ready
          to ready transition)
/"После  перехода сигнала CPRDY из низкого 
 уровня  в  высокий" (там же). - A.C./ 
     b1 = Пропадание готовности (Ready to
          not ready transition)
/"После перехода сигнала CPRDY из высокого 
 уровня в низкий" (там же). - A.C./ 
      b2 = Индексный импульс
     b3 = Немедленное прерывание, требует
           сброса
  b0-b3 = 0000 -> Закончить без прерывания
          (Terminate with no interrupt)
/"При  этом  микросхемой не вырабатывается 
сигнал подтверждения завершения выполнения 
команды" (там же). - A.C./ 
Имя команды   Код       Примечания 
 FORCE_INTERPT 0xD0 Прервать команду по 
                    указанному условию
                   (force interrupt)

           РЕГИСТР СОСТОЯНИЯ (R)
   Некоторые биты имеют разный смысл в за─
висимости от последней поданной команды.
           После команд типа 1:
 Бит Значение            Примечания 
  0  BUSY           Занято, ждите BUSY=0
                    перед подачей новой
                    команды
  1  INDEX PULSE    Индексный импульс
  2  TRACK00        Головка на 0-й дорожке
  3  CRC ERROR      Сектор повреждён
  4  SEEK ERROR     Ошибка поиска
  5  HEAD LOADED    Головка опущена на диск
  6  WRITE PROTECT  Диск защищён от записи
  7  MOTOR ON       Мотор включен или
                   дисковод не готов
         После команд типов 2/3:
 Бит Значение            Примечания 
  0  BUSY             Занято, ждите BUSY=0
                      перед подачей новой
                      команды
  1  DRQ              Требуется прочитать/
                      записать данные в
                      регистр данных
  2  LOST DATA        Ошибка (например, не
                      соблюдён порядок
                      обмена)
  3  CRC ERROR        Сектор повреждён
  4  RECORD NOT FOUND Несуществующий адрес
                      (track/sector) или
                      кончились данные для
                      чтения (no more data
                      to read)
  5  REC.TYP/WR.FAULT Чтение: тип записи
                      (тип dam); Запись:
                      ошибка записи
  6  WRITE PROTECT    Защита от записи
  7  MOTOR ON         Мотор включен или
                     дисковод не готов

           РЕГИСТР ДОРОЖКИ (RW)
   Содержит текущий номер дорожки /с точки
зрения программы. - A.C./. 

           РЕГИСТР СЕКТОРА (RW)
   Номер сект. для операций чтения/записи.

            РЕГИСТР ДАННЫХ (RW)
   Через  него читаются и пишутся данные в
контроллер. Проверяйте  регистр  состояния
перед чтением или записью байта данных.
       14. АВТОРЫ И КОНТАКТНЫЕ АДРЕСА
      ==============================
   Этот  документ  составил  Luca Bisti из
Ramsoft. Stefano Donati написал главы 3.1, 
5.1, 9.3 и помог с исправлением ошибок.
   Спасибо Dominic'у Morris'у, давшему ин─
формацию о hook codes 43h, 44h, 45h и 47h.
   Petri Andras прислал документ для главы
12.1.
   Вы  можете  связаться с этими людьми по
следующим адресам:

 * THE RAMSOFT STAFF: 
  Ramsoft WHQ (WWR)...ramsoft@retroplay.com
 Luca Bisti...............................
 ..........luca.bisti@studenti.ing.unipi.it 
 Stefano Donati.......the.king@flashnet.it

* Dominic Morris..........djm@jb.man.ac.uk 
* Petri Andras............petri@mit.bme.hu 

   Вы  можете  всегда  получить  последнюю
версию  этого  текста на домашней странице
 RAMSOFT:
  http://www.retroplay.com/Mecenate/ramsoft
           (World Wide Ramsoft)
    Если этот адрес на работает,попробуйте:
 http://www.geocities.com/SiliconValley/
Bay/5673 
   Там  будет  ссылка  на  текущий URL для
World Wide Ramsoft.

   See you there!




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

Похожие статьи:
Извращенцам - Красная Шапочка (народный фольклор).
Дебют - Фантастическая адвентюрная игра "Mindfighter".
P.S. - послесловие, авторы, благодарности.

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