Операционная система Interface 1bis |
![]() |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Здесь приведен перевод документации [1], рассматривающей особенности использования операционной системы extended BASIC совместно с Interface 1bis [2] для ZX Spectrum. Этот документ может использоваться как краткое руководство по использованию extended BASIC в контексте ввода/вывода файлов и данных, более полное руководство см. в оригинальной документации (см. doc \ ZXInterface1_Microdrive_Manual.pdf в архиве [3]). [1. Совместимость] Interface 1bis (IF1bis) является интерфейсом к устройствам хранения и обмена данными, совместимым с Sinclair 'ZX INTERFACE 1' на уровне команд BASIC, а также на уровне "хак-кодов" (Hook codes). Хак-коды (hook codes) это механизм модификации (расширения) поддерживаемой системы команд BASIC посредством перехвата сообщений об ошибке. Когда система встречает незнакомый оператор или незнакомый синтаксис оператора, то вызывается код перехвата ошибки, который корректно интерпретирует расширение системы команд. Подобная схема часто применяется для расширения ассемблерных инструкций процессоров, правда на более низком уровне. • Используется тот же самый механизм для расширения интерпретатора BASIC: страничная замена теневым ПЗУ (shadow ROM) базового ПЗУ микропрограмм (BASIC ROM) всякий раз, когда происходит ошибка синтаксиса. [2. Распределение памяти] Будучи активированным, интерфейс запрещает внутреннее ПЗУ ZX Spectrum, и подключает вместо него страницу своей собственной памяти с операционной системой (OpSys), которая размещается в двух непрерывных банках энергонезависимой памяти (NVSRAM) по 16 килобайт каждый. При этом получается следующая карта памяти:
2.1 BASIC ROM Это незначительно модифицированная копия оригинального ZX Spectrum 48k ROM, диапазон изменений ограничен следующим: - Разрешается программное управление страницами памяти для операции ввода/вывода в выделенные для управления порты. 2.2 Shadow ROM Shadow ROM полностью совместимо с 8 килобайтным ROM оригинального Sinclair 'ZX INTERFACE 1' на уровне команд BASIC и на уровне 'hook code'. Не реализованы следующие hook-коды:
2.3. Рабочее ОЗУ Рабочее ОЗУ (work RAM) структурировано следующим образом:
Внутренний стек используется для работы со снапшотами (.Z80) или для загрузки ленточных файлов (tape file, .TAP). 2.4 Буферы Имеется 7 буферов сектора по 512 байт, область данных приложения (application data) из 256 байт и таблица текущей директории. [3. Extended BASIC] 3.1 Синтаксис Реализованы все расширенные операторы 'ZX INTERFACE 1' extended BASIC в своем оригинальном формате, причем добавлены некоторые расширения синтаксиса. 3.1.1 CAT [#< str >;]{*}[< dev >;][< drv >][;< fil >|< pth >] [ABS|NOT|LN] Здесь: < str > = Stream, поток (0-15) Элементы синтаксиса в квадратных скобках не обязательны. Элементы синтаксиса в фигурных скобках принимаются, но не используются. Альтернативные элементы синтаксиса отделены друг от друга символом вертикальной линии. Хендл (handle) файла это поток, открытый на файле, с использованием опции RND. Позиция внутри записи: < pos > может быть указана в диапазоне (0..65535), потому что указатель всегда автоматически нормализуется: < rec > = < rec >+int(< pos >/512) Начальный символ '*', за которым не идет буква типа устройства, означает "M". Начальный символ '@', за которым не идет буква типа устройства, означает "E". Начальный символ '!' означает "R";1. Начальный символ '$' означает "V";1. 3.2 Устройства (Device) и каналы (Channel) 3.2.1 Устройства хранения (Storage devices)
3.2.2 Устройства обмена данными (Communication devices)
3.2.3 Каналы 3.2.3.1 Канал 'Microdrive': M Канал M предоставляет буферизированный ввод/вывод в/из поддерживаемых устройств хранения. Это совместимо с каналом 'Microdrive' оригинального интерфейса 'ZX INTERFACE 1', у которого такая же структура дескриптора. 3.2.3.2 Каналы последовательного интерфейса (RS-232 Interface): B и T По умолчанию эти каналы реализованы только для вывода. Любая операция ввода приведет к сообщению об ошибке. Канал B отправляет двоичные данные непосредственно на спулер принтера, в то время как канал T ведет себя идентично каналу P. Когда соответствующий кабель подключен к разъемам мыши и джойстика, канал B можно использовать для дуплексного асинхронного последовательного обмена данными. Реализованы только команды OPEN#, CLOSE# и FORMAT, команды SAVE, LOAD, VERIFY и MERGE не реализованы. 3.2.3.3 Канал локальной сети (Local Area Network): N Канал N предоставляет буферизированный символьный ввод/вывод через сеть. Это совместимо с оригинальной реализацией ZX INTERFACE 1. Реализованы только команды OPEN#, CLOSE# и FORMAT, команды SAVE, LOAD, VERIFY и MERGE не реализованы. 3.2.3.4 Канал 'Handle': H Канал H создается путем открытия потока к файлу, с использованием опции RND. Этот дескриптор идентичен байтам 0..30 дескриптора канала M. Такие потоки могут использоваться как handle, чтобы указать соответствующий файл в операторах LOAD, SAVE, VERIFY, MERGE и ERASE. 3.2.3.5 Канал NULL: U Не предоставляет ввода и отбрасывает любой вывод. 3.3 Имена файлов Полные имена могут быть составлены из сегментов, отделенных друг от друга символом слеша "/". Последний из сегментов предоставляет реальное имя файла, в то время как промежуточные сегменты составляют путь к файлу. Для блочного устройства значимы только первые 10 символов сегмента. Общая длина пути ограничена 254 символами. Имя, оканчивающееся на "/", представляет имя директории. У имен файлов как расширение в конце может быть буква типа файла, идущая через точку. Начальный символ "/" обозначает корневую директорию диска, и "../" означает родительскую директорию по отношению к текущей директории. Для файлового устройства пути "/A/", "/C/".."/Z/" представляют приводы A, C .. Z сервера. Также допустимо использовать альтернативную форму "a:/" и т. п. Когда не создается новый файл, в для обычных имен можно использовать групповые символы (wild cards) "?" (означает "любой символ") и "*" (означает "любое количество любых символов"), за исключением каналов и хендлов, но не в именах директорий и не в составе пути. Имена файлов чувствительны к регистру символов. 3.4 Типы файлов 3.4.1 BASIC-файлы
Чтобы можно было получить доступ к этим файлам через команды SAVE, LOAD и VERIFY, эти файлы содержат заголовок из 9 байт, со следующей структурой: 0 тип файла (0-3). 3.4.2 Обычные (Regular) файлы
Максимальная длина обычного файла составляет 16 мегабайт (32768 записей, каждая по 512 байт). 3.4.2.1 PRINT file (тип 4) Файлы PRINT реализованы в оригинальном ZX INTERFACE 1 extended BASIC, для доступа к ним через команды OPEN#, PRINT#, INKEY$# и INPUT#. 3.4.2.2 Text file (тип 5) Текстовый файл не содержит управляющих символов, помимо CR и LF, и в них все токены BASIC развернуты. Когда осуществляется запись (PRINT#) в открытый поток текстового файла, символы LF автоматически вставляются после каждого символа CR. Когда осуществляется чтение (INPUT#) из открытого потока текстового файла, любые символы LF, следующие за CR, отбрасываются. 3.4.2.3 Backup file (тип 6) Backup-файлы это копии файлов любого другого типа. 3.4.2.4 Binary file (тип 7) У двоичных файлов нет какой-то определенной структуры. 3.4.3 Файлы эмулятора
3.4.3.1 Screen dump (тип 8) 'Screen dump' представляет содержимое video RAM, к которого по умолчанию адрес загрузки #4000 и длина по умолчанию #1B00. Дампы экрана загружаются и сохраняются с указанием типа файла посредством расширения файла '.s'. 3.4.3.2 'ZX Tape' file (тип 9) Файл в формате TZX, содержащий только блоки типа #10, #2A, #30 и #32, может быть назначен как "лента для ввода" (input tape) через команду LOAD, с указанием типа файла посредством расширения '.x'. 3.4.3.3 'Tape' file (тип 10) Файл ленты (tape file) открывается для ввода или вывода через операторы LOAD или SAVE соответственно, с указанием типа файла посредством расширения '.t', после которого весь ленточный ввод BASIC или вывод перенаправляется в указанный файл, пока не будет достигнут его конец для "входной ленты" (input tape), либо когда размер файла для "выходной ленты" (output tape) превысит 16 мегабайт, либо файл будет закрыт с использованием соответственно команды LOAD или SAVE, указанные с опцией STOP. Сброс или даже выключение питание не закрывают файлы tape. Открытие 'input tape' для не существующего файла приведет к выдаче сообщения об ошибке "File not found". Открытие 'output tape' для не существующего файла приведет к созданию нового файла. Открытие 'output tape' для существующего файла будет добавлять данные в его конец. Файл 'input tape' и 'output tape' могут быть одновременно открыты для одного и того же файла, но блоки, которые были добавлены после открытого 'input tape', не будут доступны, пока 'input tape' не будет закрыт и открыт заново. Открытие 'input tape' с использованием расширения '.T' (или '.X') немедленно выполнит эквивалент из NEW, за которым идет LOAD"". Когда указано устройство "E" файл tape может быть загружен как звуковой сигнал через вход EAR ZX Spectrum, при этом звуковой сигнал ленты генерирует сам интерфейс с помощью соответствующего подключенного кабеля [4]. 3.4.3.4 (.Z80) Snapshot file (тип 11) Файлы снапшотов (.Z80) запускаются с помощью команды LOAD, с указанием типа файла через расширение '.z'. После загрузки снапшота, когда было указано расширение '.Z' (заглавная буква), интерфейс остается в состоянии 'ON - inactive'. Чтобы создать снапшот версии 1.45 48k, файл сначала должен быть открыт с использованием команды SAVE, с указанием типа файла через расширение '.z', после чего генерация NMI сохранит снапшот, и если кнопка Caps Shift не была при этом нажата, то соответствующий файл будет закрыт. Закрытие файла можно также принудительно осуществить командой VERIFY, указанной с опцией STOP, но в результате получится файл с ошибочным содержимым (его нельзя будет запустить). Сброс или даже выключение питания не приведет к закрытию файла снапшота. Если указано расширение '.Z' (заглавная буква) то будет создан снапшот версии 3.05, для 'аппаратного режима' 128k, если это возможно, иначе будет создан файл 48k. 3.4.3.5 Наложение модификаций 'POKE' Если бит 0 (AX_FLG) установлен, то ожидается, что (BUFF_P) будет содержать список модификаций 'POKE' в следующем формате:
Список будет автоматически применен после загрузки tape-файла или снапшота. Эта возможность позволяет модифицировать двоичный код (бесконечные жизни в игре и т. п.). 3.4.4 Зарезервированные типы файлов
Номера типов 12, 13 и 14 зарезервированы. Тип 15 это групповой тип (type wild card), что означает "любой тип". 3.4.5 Директории (тип 16) Директории это специальные файлы, к которым можно получить доступ командами: LOAD что означает 'поменять текущую директорию', SAVE что означает 'создать', и DELETE. 3.5 Сообщения об ошибках Сообщения об ошибках те же самые, что и у оригинального ZX INTERFACE 1, за исключением следующих:
3.6 Другие вопросы синтаксиса 3.6.1 Значения по умолчанию Будут использоваться значения по умолчанию для литеры устройства < dev >, литеры тома < sta > и номера привода < drv >, которые были указаны в последними в операторе. Для оператора 3.1.1 значение по умолчанию < str > будет 2. Для оператора 3.1.6 значение по умолчанию < csz > будет сохраненное на носителе, когда привод форматировался последний раз, иначе будет 8. 3.6.2 Команда CAT Список файлов, который выводит оператор CAT, имеет следующий формат (цифрами показаны столбцы списка):
Количество свободных секторов, доступных на приводе, выдается как результат произведения количества свободных кластеров на размер кластера. Если имя не указано, то будут каталогизированы все файлы в текущей директории. Если имя указано, то его путь покажет каталогизируемую директорию, и имя файла и его расширение будет использоваться как фильтры для вывода команды, в соответствии с чем принимается расширение '.d' для того, чтобы отобразить в списке только директории. Если за командой CAT идет токен ABS, то будут выведен только абсолютный путь. Если за CAT идет токен LN, то будет выведен список файлов с длинными именами с приводом и директорией файла. Если указан номер привода 0, то имя считается командой, и оно отправляется в периферийный порт. Причем если это оканчивается на "/" то команда интерпретируется сервером, или иначе она будет интерпретироваться периферийным контроллером. После обработки команды ожидается отправка ответа, который будет напечатан как hex-дамп, если это не подавлено токеном опции NOT. 3.6.3 Команда FORMAT Операторы 3.1.6 и 3.1.7 не применяются к файловым устройствам. Оператор 3.1.7 для устройства M идентифицирует flash-карту, и устанавливает количество зарезервированных логических приводов, если указано значение < rsd >. Для привода R, это очистит область данных приложения (application data area) и таблицу 'текущих директорий'. Токен опции NOT подавляет вывод на экран. Для оператора 3.1.6 допустимы следующие размеры кластера: 2, 4, 8 и 16. Все другие размеры будут проигнорированы, и вместо них будет применено значение по умолчанию 8. Скорость (baud rate), указанная в операторе 3.1.8, округляется вверх до стандартного значения из следующего набора: 300, 600, 1200, 2400, 4800, 9600, 19200, 57600, 115200. 3.6.4 Команда MOVE Если и источник, и место назначения команды это файлы, то операция осуществляется сектор за сектором, вместо того чтобы делать перемещение байт за байтом. Если у источника и места назначения совпадают устройство и логический привод, то исходный файл может быть переименован, если источник и место назначения находятся в одной и той же директории, или иначе источник будет перемещен. Могут использоваться следующие разделители:
Имена файлов и источника, и места назначения отсчитываются относительно текущего места расположения: устройство (device), привод (drive), директория (directory). Оператор 3.1.16 работает с повторениями. Он обработает все файлы, которые совпадут с указанным именем источника. Оператор 3.1.17 скопирует указатель на запись (record pointer) и номер записи (record number) файла, для которого в настоящее время открыт поток, в системные переменные HD__0F и HD__11 соответственно. Оператор 3.1.18 устанавливает в заданную позицию указатель файла (file pointer) для файла, в который сейчас открыт поток. Если поток был открыт в канал M, и указанная позиция не выходит за допустимые пределы файла, то указатель файла устанавливается в EOF. 3.6.5 Команда OPEN Любой файл может быть открыт для последовательного доступа, не только файлы PRINT. Опциональные ключевые слова IN, OUT или OVER принудительно открывают файл в нужно режиме - для чтения или записи соответственно. Открытие не существующего файла для чтения, с использованием опции IN, сгенерирует сообщение об ошибке "File not found". Запись в существующий файл будет либо добавлять к нему данные, если файл был открыт с опцией OUT, либо иначе файл будет перезаписывается, если была использована опция OVER. Открытие файла с опцией RND создает для файла 'handle' для произвольного доступа. 3.6.6 Команды SAVE, LOAD и VERIFY Когда загружается программа, то функция автозапуска (auto-run) может быть подавлена указанием расширения файла '.p' (в нижнем регистре). Опция BIN позволяет загрузить, сохранить или проверить блок памяти из указанной позиции или в указанной позиции файла любого типа. Если к файлу осуществляется доступ через 'handle' вместо имени, то указатель, введенный с опцией BIN, не используется, но вместо этого он сохраняется в соответствующий дескриптор канала H, который установится в 0, когда файл открывается, и впоследствии обновляется автоматически с каждой операцией. 3.6.7 Команда ERASE Форма команды ERASE < fsq > работает с повторениями. Она обработает все файлы, которые соответствуют указанному имени. 3.6.8 Команды принтера Команды LPRINT, LLIST и COPY работают так же, как это ожидается для принтера ESC/P. Блок графики и символы UDG печатаются как растровые картинки с плотностью 80 DPI. Системные переменные P_POSN и PR_CC используются следующим образом:
OPEN #< str >,"P" отправит в принтер строку инициализации Когда интерфейс подключен к PC сервера, то задания печати перенаправляются на приложение сервера, которое направляет их на принтер или в файл спула. [4. Структуры данных] 4.1 Системные переменные ZX INTERFACE 1
Примечание: не показанные в таблице переменные не используются. 4.1.1 FLAGS3 Биты 0-4 означают то же самое, что и в оригинальном 'Shadow ROM' ZX INTERFACE 1. Бит 0 в Shadow ROM произведен вход второй раз для той же самой ошибки. Бит 1 в Shadow ROM производен вход первый раз после создания новых системных переменных, или выполняется команда CLEAR#. Бит 2 в Shadow ROM произведен вход посредством hook-кода. Бит 3 выполняется команда CAT. Бит 4 выполняется команда MOVE по принципу перемещения символа за символом, или имя места назначения (Destination) в команде MOVE содержит групповые символы (wild cards), или в команде CAT было указано имя файла, или было произведено подавление автозапуска загруженной программы BASIC, или опция SAVE / LOAD указана в верхнем регистре. Бит 5 выполняется SAVE / LOAD / VERIFY канала H(andle). Бит 6 найдено последнее совпадение (last match) операции поиска. Бит 7 найдено следующее совпадение (next match) операции поиска. 4.1.2 VECTOR и SER_FL То же самое, что и в оригинальном 'Shadow ROM' ZX INTERFACE 1. 4.1.3 Спецификаторы файла Два 8-байтных спецификатора файла в DSTR_1 и DSTR_2 осуществляют ту же функцию, что и в оригинальном ZX INTERFACE 1 'Shadow ROM', за исключением старшего байта номера привода, который используется для хранения длины имени пути, и старшего байта длины имени файла, который используется для сохранения типа файла. 4.1.4 BASIC header: HD__00 .. HD__11 То же самое, что и в оригинальном 'Shadow ROM' ZX INTERFACE 1. 4.1.5 HD__DV и HD__DR Заменены старший байт HD_11 high и COPIES. Здесь сохраняются номер устройства (device) и привода (drive). 4.2 Дескриптор канала M
4.3 Дескриптор канала N
4.4 Рабочее ОЗУ (Work RAM, 512 байт) Отображено на адрес #2E00 теневого ПЗУ (Shadow ROM). 4.4.1 Главный дескриптор логического диска (13 байт)
4.4.2 Альтернативный дескриптор логического диска (13 байт) Такая же структура, как и главного дескриптора.
4.4.3 Номера блока по умолчанию и файлового устройства (2 байта)
4.4.4 Размеры носителя данных Flash, в логических приводах (8 байт)
4.4.5 Запасное пространство инициализированных переменных (12 байт)
4.4.6 Указатели буферов секторов (16 байт)
4.4.7 Переменные вывода на ленту (Output tape), 10 байт
4.4.8 Переменные для ввода с ленты (Input tape), 10 байт
4.4.9 Переменные снапшота (10 байт)
4.4.10 Указатель на буфер принтера (2 байта)
4.4.11 Дескриптор файлового устройства (16 байт)
4.4.12 Вспомогательная переменная (Auxiliary), 4 байта
4.4.13 Номер блока Flash-привода (6 байт)
4.4.14 Параметры для места назначения файла операции Copy/Rename (5 байт)
4.4.15 Временный буфер для имени файла (11 байт)
4.4.16 Место для записи директории (6 байт)
4.4.17 Внутренний стек (48 байт)
4.4.18 Буфер принтера (64 байта)
4.4.19 Буфер страницы (256 байт)
4.5 Буферы секторов (4 килобайта) 4.5.1 Буферы секторов
4.5.2 Данные приложения (256 байт)
4.5.3 Текущая таблица директорий (256 байт) В этой таблице хранится информация по последним 64 директориям блочного устройства.
[5. Файловые системы] Реализованы две различные файловые системы: - Блочные устройства (Block devices): память на flash-карте SD и диск в ОЗУ (RAM drive). 5.1 Протокол обмена К устройствам хранения осуществляется доступ через "запрос блоков" ('request blocks'), отправляемый периферийному контроллеру, который обрабатывает все низкоуровневые операции ввода/вывода. Структура блока команды следующая:
После обработки этой команды периферийный контроллер посылает обратно блок ответа ('reply block'):
5.2 Устройства обмена данными (Communication devices) Тот же самый протокол используется для обмена с устройствами, не являющимися устройствами хранения: - Асинхронный последовательный порт Протокол реализован для следующих команд:
Команда передачи последовательного порта (параметр 1) посылает 1-512 байт данных. Максимальное количество байт, принимаемых последовательным портом, может быть указано (команда с параметром 2) длиной в диапазоне 1-256. Длина данных для команд передачи и приема Ethernet ограничена 255 байтами. Для обмена данными через сеть IP у следующих команд имеется 4-байтное расширение заголовка:
5.3 Блочные устройства Блочное устройство бывает следующих типов: - Локальное, local (station 0): это встроенная карта памяти microSD или диск в ОЗУ (RAM drive). 5.3.1 Возможности файловой системы Карта microSD неявно поделена на логические диски фиксированного размера 32 мегабайт (65536 секторов по 512 байт). Размер карты ограничен 255 логическими дисками, т. е. 8 гигабайтами. Блок памяти на диске (allocation unit, кластер) может быть размером 2, 4, 8 или 16 секторов. FAT содержит (65536 / размер кластера) записей, занимающих сектора от 1 до (256 / размер кластера). Сектор номер (256 / размер кластера) + 1 содержит первую запись корневой директории (root directory). Диск в ОЗУ (RAM drive) имеет емкость 256 секторов = 128 килобайт. Размер его кластера составляет 1 сектор. Сектор 1 содержит FAT, и сектор 2 содержит первую запись корневой директории. Логические диски отформатированы в соответствии с упрощенной 16-битной системой FAT. У этой FAT пронумерованы сектора, а не кластеры. Сектор 0 любого логического диска не используется. Поскольку кластер 0 всегда занят под FAT, соответствующая запись FAT (байты 0 и 1 сектора 1) используются для хранения размера кластера. Поскольку сектора 0 и 1 недоступны для выделения, то соответствующие значения записи FAT используются для маркировки: 0000 свободный кластер, 0001 последний кластер файла. Директории содержат последовательности 16-байтных спецификаторов файла:
Здесь байт #FF используется в качестве маркета окончания последовательности. Размер директории/поддиректории ограничивается только доступным местом и глубиной дерева директорий. Максимальная длина имени пути ограничена 255 байтами. Первый элемент первой записи директории имеет следующую структуру:
Когда файл удален, его родительская директория уплотняется на 16 байт путем исправления соответствующей записи и сдвига всех остальных записей справа от записи удаленного файла. 5.3.2 Команды блочного устройства
5.3.3 Замечания - 'Адрес' это 4-байтный номер сектора. - Номер сектора с установленным самым старшим битом (31) интерпретируется как адрес диска ОЗУ (RAM drive). - 'Идентификатор' это 8-байтная строка идентификатора карты, за которой следует 4-байтная емкость карты (последний номер сектора). - 'Сектор' это блок данных из 512 байт. - Запись сектора требует 2 шагов: 1. Указать номер сектора командой 'Установка адреса записи' (параметр 5). - Команда 'Записать из буфера' (11) запишет сектор, который был ранее прочитан предыдущей командой 'Прочитать в буфер' (9). - Стирание блока (erase) требует 3 шагов: 1. Указать начало блока командой 'Первый адрес стирания' (13). - Команда 'Прием - запись' (4) отправляет команду 'Прочитать сектор' в файловое устройство, з записывает принятый блок по указанному адресу блочного устройства. - Команда 'Чтение - передача' (7) читает блок по указанному адресу из блочного устройства и посылает его в файловое устройство выдачей команды 'Записать сектор' (10). - После команды 'Прочитать несколько блоков' (6) поток байт может быть прочитан со скоростью инструкции INI (16 T-состояний), пока это не будет остановлено повторной выдачей команды (с произвольным адресом). Указатель чтения в любое время может быть переставлен на начало блока, если подать ту же самую команду без адреса. - Команда 'Проиграть tape-файл' (3) нуждается в качестве данных:
5.3.4 Разделение больших последовательных файлов Чтобы иметь возможность использовать файлы мультимедиа (типы 12-14) размером до 4 гигабайт, команда 3.1.7 может быть использована для резервирования < rsd > (1- 127) логических дисков, с целью разделение больших последовательных файлов, что также относится к пространству носителя данных карты SD, которое превышает максимальный размер тома 8 гигабайт. Директория раздела сохраняется начиная с сектора 0 логического диска: (< размер тома в секторах >/65536 - < rsd > + 1), и распространяется на 4 сектора, так что может содержать максимум 128 записей следующей структуры:
Байт #FF обозначает конец записей. Это сопровождается файлами, сохраненными друг за другом в том порядке, в каком они появляются в директории. Номер сектора первой записи файла должен быть вычислен парсингом директории и добавлением 4 + накопленная длина, предшествующая началу раздела. 5.4 Файловые устройства Файловое устройство может быть следующих видов: - Локальное (станция 0): это компьютер сервера, подключенный через порт USB. 5.4.1 Команды файлового устройства
5.4.2 Замечания - 'Handle' это число в диапазоне 0-15. - 'Type' это число в диапазоне 0-15, определенное в п. 3.4. - 'Постоянный файл' выделяет handle = 1-15. Тот же самый handle не выделяется, пока файл не будет явно закрыт. - 'Временный файл' всегда выделяет handle = 0. Создание или открытие другого 'временного файла' автоматически закрывает предыдущий временный файл. - Функция 'Открыть зарезервированный handle' создает файл, указанный, когда handle был зарезервирован, с заданным типом. - Для команды 'Установить указатель в файле' можно указать позицию в файле либо двумя, либо четырьмя байтами: [< Pos >]< Rec >, где < Pos >= указателю записи (0-511) и < Rec >= номеру записи (0-32767). Если был отправлен только 1 байт, то указатель устанавливается на начало файла, и его handle и длина будут возвращены в ответе пятью байтами. - Команда 'Получить длинное имя' возвратит длинное имя последнего файла, найденного командой 'Найти [следующий] файл'. 5.4.3 Возврат команд 'Найти [next] файл' Команды 'Найти файл' и 'Найти следующий файл' возвратят 16-байтный дескриптор:
5.4.4 Возврат команд 'Открыть временный файл', 'Открыть постоянный файл' и 'Открыть следующий файл' Дескриптор, возвращаемый командой 'Open temporary|permanent [next] file', содержит также handle файла:
5.4.5 Возврат команд 'Создать временный файл' и 'Создать постоянный файл' Хендл, который возвращают команды 'Create temporary|permanent file', это двухбайтный номер в диапазоне 0-15. После команды 'Найти файл' или 'Открыть временный файл' последующая команда 'Найти следующий файл' или 'Открыть следующий файл' сделает попытку найти/открыть следующий файл, который совпадет с заданным именем. 5.4.6 Операция копирования/переименования (copy|rename) требует 2 шагов: - Исходный файл находится выдачей команды 'Find [next] file' (Найти [следующий] файл). 5.4.7 Список возврата команд 'Первый|Следующий список файлов' Список, который возвращает команда 'First|Next file list', это последовательность 16-байтных дескрипторов файлов, как они возвращаются командой 'Find [next] file' (Найти [следующий] файл), с маркером #FF, обозначающим конец списка. Дескрипторы, которые возвращает команда 'First|Next BASIC file list' (Первый|Следующий список BASIC-файлов) для типов файлов 0-3, также содержат информацию из 9-байтного заголовка файлов BASIC:
5.4.8 Возврат команд 'Первая строка длинного имени' и 'Следующий список файлов/строка' Команды 'First long name line' и 'Next file list/line' возвращают то же самое, что и команды 'First directory list' и 'Next directory list' соответственно, но вернут один список директории в следующем формате:
[6. Hook-коды] Ниже в таблице приведены hook-коды ZX INTERFACE 1.
Дополнительные hook-коды:
Здесь 'File type literal (буква типа файла) это символ, определенный в п. 3.4, 'Device type literal' (буква типа устройства) это символ, определенный в п. 3.2. 'Device code' (код устройства) это байт, определенный следующим образом:
6.1 Консольный ввод (#1B) 6.1.1 Действие: ожидание нажатия на клавишу 6.2 Консольный вывод (#1C) 6.2.1 Действие: послать символ на экран 6.3 Ввод RS232 (#1D) 6.3.1 Действие: прием символа, поступающего снаружи, с таймаутом после 1 секунды 6.4 Вывод RS232 (#1E) 6.4.1 Действие: отправить символ наружу, с бесконечным ожиданием 6.5 Вывод на принтер (#1F) 6.5.1 Действие: напечатать символ на принтере 6.6 Опрос клавиатуры (#20) 6.6.1 Действие: проверить, нажата ли клавиша 6.7 Выбор привода/диска (стандартного, legacy) (#21) 6.7.1 Действие: установить (A) в качестве текущего устройства (DEV_LT) 6.8 Открыть канал (#22) 6.8.1 Действие: открытие канала Файловый канал - (A) = #BF (IN) - открыть для чтения Не-файловый канал - (DRV_NR) = номер станции (0-7) только для канала N 6.8.3 Выходные данные: 6.9 Закрыть канал (#23) 6.9.1 Действие: закрытие канала 6.10 Удалить файл (#24) 6.10.1 Действие: удаляет файл Дескриптор: - (DRV_NR) = номер привода (1-255) Handle: - (STR_NR) = handle (0-15) 6.10.3 Выходные данные: отсутствуют 6.11 Последовательное чтение (#25) 6.11.1 Действие: прочитать следующую запись 6.12 Последовательная запись (#26) 6.12.1 Действие: записать текущую запись 6.13 Прочитать запись (#27) 6.14 Прочитать сектор (legacy, стандартная операция) (#28) 6.15 Прочитать следующий сектор (legacy, стандартная операция) (#29) 6.16 Записать сектор (legacy, стандартная операция) (#2A) 6.17 Создать канал (#2B) Файловый канал - (A) = #BF (IN) - открыть для чтения Не файловый канал - (DRV_NR) = номер станции (0-7), только для канала N 6.17.3 Выходные данные: 6.18 Удалить канал (#2C) 6.19 Открыть сетевой канал (#2D) 6.20 Закрыть сетевой канал (#2E)
6.21 Получить пакет (#2F) 6.22 Послать пакет (#30) 6.23 Создать системные переменные (#31) 6.24 Выполнить код (#32) 6.25 Прочитать следующий заголовок (#33) 6.26 Создать канал типа B (#34) 6.27 Прочитать сектор (#35) 6.28 Записать сектор (#36) 6.29 Следующий сектор (#37) 6.30 Отменить (reclaim) все 'ad-hoc' каналы (#38) 6.31 Найти файл (#39) Дескриптор: - (DRV_NR) = номер привода (диска) (0-65535) Handle: - (STR_NR) = Handle (0-15) 6.31.3 Выходные данные: 6.32 Найти следующий файл (#3A) 6.33 Открыть поток (#3B) Файловый канал - (A) = #BF (IN) - открыть для чтения Не файловый канал - (DRV_NR) = номер станции (0-7), только для канала N 6.33.3 Выходные данные: отсутствуют. 6.34 Закрыть поток (#3C) 6.35 SAVE / LOAD (#3D) Тип операции: - (A) = 0,4 - SAVE, очищается указатель файла и выполняется сохранение Параметры файла, указанные дескриптором или через handle Дескриптор: - (DRV_NR) = номер привода (диска) (0-65535) Handle: - (STR_NR) = хендл (0-15) Код типа данных Параметры программы BASIC, только для типов данных: 0 Параметры массива BASIC, только для типов данных 1 и 2 Адрес блока памяти, только для типов данных 3-7 Длина блока памяти, только для типов данных 3-7 Файловый указатель, только для типов данных 4-7 Этот указатель автоматически обновляется после операции. 6.35.3 Выходные данные: отсутствуют 6.36 Копировать (copy) / переименовать (rename) файл (#3E) Тип операции (только для двух файловых каналов): - (A) = #CC (TO) - Copy Источник: указывается потоком или каналом Поток: - (STR_NR) = номер потока (0-15) Файловый канал: - (DRV_NR) = номер привода (диска) (0-65535) Не файловый канал: - (DRV_NR) = номер станции (0-7), только для канала N Место назначения, указанное потоком или файловым дескриптором Поток: - (STR_N2) = номер потока (0-15) Файловый канал: - (DRV_N2) = номер привода (диска) (0-65535) Не файловый канал: - (DRV_N2) = номер станции (0-7), только для канала N 6.36.3 Выходные данные: отсутствуют 6.37 Получить файловый указатель (#3E) Канал, указанный по его адресу или номеру потока Адрес канала: Номер потока: 6.37.3 Выходные данные: 6.38 Установить файловый указатель (#3E) Канал, указанный по его адресу или номеру потока Адрес канала: Номер потока: Номер канала: 6.38.3 Выходные данные: отсутствуют 6.39 Каталог (#3F) Может быть указано имя директории или имени файла, чтобы использовать их как фильтр для вывода команды. - (NAM_LN) = длина имени (1-254) 6.39.3 Выходные данные: Накопленная длина каталогизируемых файлов 6.40 Формат логического привода/диска (#40) или - (A) = 0 6.40.3 Выходные данные: отсутствуют 6.41 Очистка экрана (#41) 6.42 Закрыть все потоки (#42) 6.43 Команда периферийного модуля (#43) 6.44 Получить абсолютный путь (#44) Относительное имя пути - (NAM_LN) = длина имени файла (1-254) или 0 для текущей директории 6.44.3 Выходные данные: абсолютный путь в BUFF_3 (см. п. 4.5.1) 6.45 Получить первый список директории (строка) (#45) Относительный путь - (NAM_LN) = длина имени директории (1-254) или 0 для текущей директории 6.45.3 Выходные данные: первый список директории/строка в BUFF_3 6.46 Получить следующий список директории (строка) (#46) 6.47 Печать целого числа (#47)
6.47.3 Выходные данные: если установлены оба ZR и CY, то печатаемые цифры считаются в (HD__0D), и их сумма вычисляется в (HD__0F и HD__11). 6.48 Команда периферийного устройства (#48) 6.49 Передача-прием периферийного устройства (#49) 6.50 Получить размер устройства (#4A) 6.51 Прием последовательного порта (#4B) Эта функция имеет таймаут 1 секунду, после истечения которого будет возвращено 0 байт 6.51.2 Входные данные: 6.52 Передача последовательного порта (#4C) Эта функция имеет таймаут после 12 секунд, после истечения которого выдается сигнал 'Communication error' (ошибка обмена). 6.52.2 Входные данные: 6.53 Чтение строки из канала M (#4D) 6.54 Запись строки в канал M (#4E) 6.55 Проверка наличия устройства (#4F) 6.56 Прием через Ethernet (#50) 6.57 Передача Ethernet (#51) 6.58 Получить длинное имя (#52) [Ссылки] 1. Interface 1bis for the Sinclair ZX Spectrum 48k Ver 4b-4c Operating system reference site:sites.google.com. |