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!