Операционная система 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) всякий раз, когда происходит ошибка синтаксиса.
• Одинаковый синтаксис extended BASIC.
• Одинаковые системные переменные.
• Тот же самый механизм для доступа к подпрограммам shadow ROM: 'Hook codes'.
• Те же структуры для обработки последовательного доступа к файлам - через канал M (M channel), и к сетевому обмену данными - через канал N (N channel).

[2. Распределение памяти]

Будучи активированным, интерфейс запрещает внутреннее ПЗУ ZX Spectrum, и подключает вместо него страницу своей собственной памяти с операционной системой (OpSys), которая размещается в двух непрерывных банках энергонезависимой памяти (NVSRAM) по 16 килобайт каждый. При этом получается следующая карта памяти:

Банк Смещение Размер Адрес Защищено от записи
BASIC ROM #0000 #4000 #0000 Да
Shadow ROM
Work RAM
Буферы
#4000
#6E00
#7000
#2E00
#0200
#1000
#0000
#2E00
#3000
Да
Нет
Нет

2.1 BASIC ROM

Это незначительно модифицированная копия оригинального ZX Spectrum 48k ROM, диапазон изменений ограничен следующим:

- Разрешается программное управление страницами памяти для операции ввода/вывода в выделенные для управления порты.
- Перехватываются вызовы к подпрограммам, взаимодействующим с лентой, чтобы правильно работать с .TAP файлами.
- Модифицирована обработка NMI, чтобы позволить создавать снапшоты (.Z80), и опционально Осуществлять интеграцию с драйвером принтера ESC/P в ZX Spectrum BASIC.
- Исправлены некоторые известные баги ZX Spectrum 48k ROM.

2.2 Shadow ROM

Shadow ROM полностью совместимо с 8 килобайтным ROM оригинального Sinclair 'ZX INTERFACE 1' на уровне команд BASIC и на уровне 'hook code'. Не реализованы следующие hook-коды:

Код Функция
#33 Прочитать следующий заголовок

2.3. Рабочее ОЗУ

Рабочее ОЗУ (work RAM) структурировано следующим образом:

Адрес Блок Байт
#2E00
#2E80
#2EC0
#2F00
Переменные
Внутренний стек
Буфер принтера
Буфер страницы
128
64
64
256

Внутренний стек используется для работы со снапшотами (.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]
3.1.2 CLEAR #
3.1.3 CLOSE #< str >
3.1.4 CLS #
3.1.5 ERASE < spe >|#< hdl >
3.1.6 FORMAT [#< csz >;]{*}[< dev >;][< drv >] [NOT]
3.1.7 FORMAT [#< rsd >;]{*}[< dev >;] 0 [NOT]
3.1.8 FORMAT "B";< brt >
3.1.9 FORMAT "N";< sta >;< sid >
3.1.10 INKEY$ #< str >
3.1.11 INPUT #< str >,< var >
3.1.12 LOAD < chn >|#< hdl > [< opt >]
3.1.13 LOAD [[*< dev >;]< drv >];< pth >
3.1.14 LOAD STOP
3.1.15 MERGE < chn >|#< hdl >
3.1.16 MOVE < spe >|< nfc >|#< str > TO|AT|OVER|IN|MERGE < spe >|< nfc >|#< str >
3.1.17 MOVE #< str >|#< hdl > VAL
3.1.18 MOVE #< str >|#< hdl > POINT [< pnt >]
3.1.19 OPEN #< str >;{*}[[< dev >;]< drv >];< fil > [IN|OUT|OVER|RND]
3.1.20 OPEN #< str >;< nfc >
3.1.21 PRINT #< str >;< exp >
3.1.22 SAVE < chn >|#< hdl > [< opt >]
3.1.23 SAVE [[*< dev >;]< drv >];< pth >
3.1.24 SAVE STOP
3.1.25 VERIFY < chn >|#< hdl > [< opt >]
3.1.26 VERIFY STOP

Здесь:

< str > = Stream, поток (0-15)
< hdl > = Handle, хендл (0-15)
< chn > = Channel, канал
        = [*< dev >;][< drv >];< fil >
< nfc > = Non-file channel, не файловый канал
        = {*}"B"|"T"
        = {*}"N";< sta >
< spe > = Спецификатор
        = {*}[< dev >;][< drv >];< fil >|< pth >
< dev > = Спецификатор устройства (device)
        = < typ >[< sta >]
< typ > = Буква типа устройства
        = M flash "M"icrodrive
        = R "R"AM drive
        = V ser"V"er drive
< sta > = Номер станции (устройства), 0-7
        = 0 локальная станция
        = 1..7 станция, подключенная через IP-сеть
< drv > = Номер привода (drive number), 1-255
< fil > = Файл (состоит из 1-254 символов)
        = [< pth >]< nam >[.< fty >]
< dir > = Директория (1-254 символов)
        = < nam >/
< pth > = Путь (1-254 символов)
        = [/]< dir >< dir >..< dir >
< nam > = Имя (1-254 символов)
< fty > = Буква типа файла (1 символ), подробнее см. раздел 3.4.
< opt > = опции для команд SAVE, LOAD или VERIFY
        = LINE < lin >
        = DATA < ary >[$]()
        = CODE [< add >[,< len >{,< pnt >}]]
        = SCREEN$
        = BIN [< add >[,< len >[,< pnt >]]]
< lin > = Номер строки для автозапуска программы BASIC (0-9999)
< ary > = Имя массива
< add > = Адрес блока памяти (0-65535)
< len > = Длина блока памяти (0-65535)
< pnt > = Указатель позиции в файле (File pointer)
        = < rec >[,< pos >]
< rec > = Номер записи (0-32767)
< pos > = Позиция внутри записи (0-511)
< var > = Переменная BASIC
< exp > = Выражение BASIC
< csz > = Единица памяти в секторах/кластерах (2, 4, 8, 16)
< rsd > = Количество зарезервированных приводов (1-127)
< brt > = Скорость (baud rate) в единицах бит/сек (0-65535)
< sid > = Имя или IP-адрес (1-254 символов)

Элементы синтаксиса в квадратных скобках не обязательны. Элементы синтаксиса в фигурных скобках принимаются, но не используются. Альтернативные элементы синтаксиса отделены друг от друга символом вертикальной линии.

Хендл (handle) файла это поток, открытый на файле, с использованием опции RND.

Позиция внутри записи: < pos > может быть указана в диапазоне (0..65535), потому что указатель всегда автоматически нормализуется:

   < rec > = < rec >+int(< pos >/512)
   < pos > = mod(< pos >,512)

Начальный символ '*', за которым не идет буква типа устройства, означает "M". Начальный символ '@', за которым не идет буква типа устройства, означает "E". Начальный символ '!' означает "R";1. Начальный символ '$' означает "V";1.

3.2 Устройства (Device) и каналы (Channel)

3.2.1 Устройства хранения (Storage devices)

3.2.1.1 "M" (0) карта SD блочное устройство
3.2.1.2 "E" (1) магнитофонная лента на входе EAR (Tape player EAR port) блочное устройство
3.2.1.3 "R" (2) виртуальный диск в ОЗУ (RAM drive) блочное устройство
3.2.1.4 "V" (3) сервер файловое устройство

3.2.2 Устройства обмена данными (Communication devices)

3.2.2.1 "B" (4) Асинхронный последовательный порт
3.2.2.2 "N" (5) 10 мегабит/сек Ethernet

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-файлы

Тип Буква Описание Расширение
0
1
2
3
P
N
A
C
Программа на языке BASIC
Числовой массив
Строковый массив
Блок CODE
ZZP
ZZN
ZZA
ZZC

Чтобы можно было получить доступ к этим файлам через команды SAVE, LOAD и VERIFY, эти файлы содержат заголовок из 9 байт, со следующей структурой:

0 тип файла (0-3).
1-2 длина файла (не считая длины заголовка).
3-4 адрес загрузки (Code, для двоичного кода).
5-6 длина только программы (Program, для программы BASIC) или имя массива (цифровое или буквенное).
7-8 стартовая строка (Program, для программы BASIC).

3.4.2 Обычные (Regular) файлы

Тип Буква Описание Расширение
4
5
6
7
F
E
K
B
PRINT file
Text file
Backup file
Binary file
ZZF
ZZE
ZZK
ZZB

Максимальная длина обычного файла составляет 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 Файлы эмулятора

Тип Буква Описание Расширение
8
9
10
11
S
X
T
Z
Screen dump
'ZX Tape' file
Tape file
'Z80' snapshot
SCR
TZX
TAP
Z80

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' в следующем формате:

Смещение Описание
0
1-2
3
Flag. Если здесь #FF, то это конец списка.
Address
Data

Список будет автоматически применен после загрузки tape-файла или снапшота. Эта возможность позволяет модифицировать двоичный код (бесконечные жизни в игре и т. п.).

3.4.4 Зарезервированные типы файлов

Тип Буква Описание Расширение
12
13
14
15



Y
Зарезервировано
Зарезервировано
Зарезервировано
Any type (любой тип файла)



*

Номера типов 12, 13 и 14 зарезервированы. Тип 15 это групповой тип (type wild card), что означает "любой тип".

3.4.5 Директории (тип 16)

Директории это специальные файлы, к которым можно получить доступ командами: LOAD что означает 'поменять текущую директорию', SAVE что означает 'создать', и DELETE.

3.5 Сообщения об ошибках

Сообщения об ошибках те же самые, что и у оригинального ZX INTERFACE 1, за исключением следующих:

#07 "Missing name" (пропущенное имя) не используется
#08 "Missing station number" (пропущен номер станции) не используется
#09 "Missing drive number" (пропущен номер привода) не используется
#0A  "Missing baud rate" (пропущена скорость) заменено на "Communication error" (ошибка связи)
#0B "Header mismatch error" (ошибка совпадения заголовка) заменено на "Directory in use" (директория используется)
#13 "Hook code error" (ошибка хак-кода) заменено на "File exists" (файл существует)
#15 "MERGE error" (ошибка слияния) заменено на "Invalid path" (неправильный путь)
#17 "Wrong file type" (ошибочный тип файла) не используется

3.6 Другие вопросы синтаксиса

3.6.1 Значения по умолчанию

Будут использоваться значения по умолчанию для литеры устройства < dev >, литеры тома < sta > и номера привода < drv >, которые были указаны в последними в операторе.

Для оператора 3.1.1 значение по умолчанию < str > будет 2.

Для оператора 3.1.6 значение по умолчанию < csz > будет сохраненное на носителе, когда привод форматировался последний раз, иначе будет 8.

3.6.2 Команда CAT

Список файлов, который выводит оператор CAT, имеет следующий формат (цифрами показаны столбцы списка):

1-10 Имя файла
12 Буква типа файла
14-21 Длина файла в байтах
23-27 Строка автозапуска (Program, программа на BASIC)
Буква массива (цифрового или символьного)
Адрес загрузки (Code, двоичный код)

Количество свободных секторов, доступных на приводе, выдается как результат произведения количества свободных кластеров на размер кластера.

Если имя не указано, то будут каталогизированы все файлы в текущей директории. Если имя указано, то его путь покажет каталогизируемую директорию, и имя файла и его расширение будет использоваться как фильтры для вывода команды, в соответствии с чем принимается расширение '.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

Если и источник, и место назначения команды это файлы, то операция осуществляется сектор за сектором, вместо того чтобы делать перемещение байт за байтом.

Если у источника и места назначения совпадают устройство и логический привод, то исходный файл может быть переименован, если источник и место назначения находятся в одной и той же директории, или иначе источник будет перемещен. Могут использоваться следующие разделители:

Разделитель Операция Перезапись существующих файлов
TO
OVER
AT
IN
MERGE
copy
copy
move/rename
move/rename
append
Нет
Да
Нет
Да

Имена файлов и источника, и места назначения отсчитываются относительно текущего места расположения: устройство (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 используются следующим образом:

Переменная Адрес Длина Описание
P_POSN #5C7F (23679) 1 Номер столбца
PR_CC



#5C80 (23680)
#5C81 (23681)


1
1
1

Количество строк на странице минус номер строки
Бит 7, 0: 64 столбца
       1: 32 столбца
Биты 0-6: количество строк на странице

OPEN #< str >,"P" отправит в принтер строку инициализации

Когда интерфейс подключен к PC сервера, то задания печати перенаправляются на приложение сервера, которое направляет их на принтер или в файл спула.

[4. Структуры данных]

4.1 Системные переменные ZX INTERFACE 1

Переменная Адрес Длина Замена
FLAGS3 #5CB6 (23734) 1  
VECTOR #5CB7 (23735) 2
..      
SER_FL #5CC7 (23751) 1 D_STR1
PTH_LN #5CD7 (23767) 1  
STR_NR #5CD8 (23768) 1 S_STR1
DEV_LT #5CD9 (23769) 1 L_STR1
NAM_LN #5CDA (23770) 1 N_STR1
FIL_TY #5CDB (23771) 1  
NAM_AD #5CDC (23772) 2 P_STR1
DRV_N2 #5CDE (23774) 1 D_STR2
PTH_L2 #5CDF (23775) 1  
STR_N2 #5CE0 (23776) 1 S_STR2
DEV_L2 #5CE1 (23777) 1 L_STR2
NAM_L2 #5CE2 (23778) 1 N_STR2
FIL_T2 #5CE3 (23779) 1  
NAM_A2 #5CE4 (23780) 2 P_STR2
HD__00 #5CE6 (23782) 1 HD_00
HD__0B #5CE7 (23783) 2 HD_0B
HD__0D #5CE9 (23785) 2 HD_0D
HD__0F #5CEB (23787) 2 HD_0F
HD__11 #5CED (23789) 1 HD_11
HD__DV #5CEE (23790) 1  
HD__DR #5CEF (23791) 1 COPIES

Примечание: не показанные в таблице переменные не используются.

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

Смещение Имя Описание
0   Адрес подпрограммы обработки ошибки (0008).
2   Адрес подпрограммы обработки ошибки (0008).
4   Тип канала ("M" или "M"+128 для 'ad-hoc' каналов).
5   Адрес подпрограммы вывода.
7   Адрес подпрограммы ввода.
9   Длина канала (595).
11 CHBYTE Указатель записи (0-512).
13 CHREC Номер записи, младший байт.
14 CHNAME 10 байт имени файла с завершающими пробелами.
24 CHFLAG Байт флагов: бит 0 - файл открыт для записи,
                     бит 1 - файл не существует.
25 CHDRIV Номер привода.
26 CHMAP Номер родительской директории для блокового устройства, или handle файла для файлового устройства.
28   Буква, обозначающая тип файла.
29   Номер записи, старший байт.
30   Код устройства.
.. Не используется.
67 RECFLG Байт флагов: бит 0 = 0,
                     бит 1 - последняя запись,
                     бит 2 - не файл PRINT.
68 RECNUM Не используется.
69 RECLEN Количество байт данных в текущей записи (0-512).
71 RECNAM Не используется.
81 DESCHK Не используется.
82 CHDATA 512 байт данных.
594 DCHK Не используется.

4.3 Дескриптор канала N

Смещение Имя Описание
0   Адрес подпрограммы обработки ошибки (0008).
2   Адрес подпрограммы обработки ошибки (0008).
4   Тип канала ("N" или "N"+128 для 'ad-hoc' каналов).
5   Адрес подпрограммы вывода.
7   Адрес подпрограммы ввода.
9   Длина канала (276).
11 NCIRIS Номер станции назначения.
12 NCSELF Не используется.
13 NCNUMB Номер блока.
15 NCTYPE Код типа пакета: 0 данные, 1 EOF.
16 NCOBL Количество байт в блоке данных.
17 NCDCS Не используется.
18 NCHCS Не используется.
19 NCCUR Позиция последнего символа, полученного из буфера.
20 NCIBL Количество байт во входном буфере.
21 NCB 255 байт данных.

4.4 Рабочее ОЗУ (Work RAM, 512 байт)

Отображено на адрес #2E00 теневого ПЗУ (Shadow ROM).

4.4.1 Главный дескриптор логического диска (13 байт)

#2E00 CRT_DV Код текущего устройства.
#2E01 CRT_DR Номер текущего привода.
#2E02 PRV_DV Код предыдущего устройства.
#2E03 PRV_DR Номер предыдущего привода.
#2E04 CLU_SZ Размер кластера - 1.
#2E05 RES_DR Количество зарезервированных логических приводов.
#2E06 ROOT_D Первый номер сектора корневой директории.
#2E07 ALC_SN Номер последнего выделенного сектора.
#2E09 ICL_SN Номер сектора в кластере.
#2E0B FAT_SN Указатель на номер сектора FAT.

4.4.2 Альтернативный дескриптор логического диска (13 байт)

Такая же структура, как и главного дескриптора.

#2E0D ALT_DV

4.4.3 Номера блока по умолчанию и файлового устройства (2 байта)

#2E1A DEF_ST

4.4.4 Размеры носителя данных Flash, в логических приводах (8 байт)

#2E1C FLA_DN

4.4.5 Запасное пространство инициализированных переменных (12 байт)

#2E24 VARS_E Запасное пространство инициализированных переменных.

4.4.6 Указатели буферов секторов (16 байт)

#2E30 SECT_0 Указатель для буфера 0.
#2E32 SECT_1 Указатель для буфера 1.
#2E34 SECT_A Указатель для буфера A.
#2E36 SECT_3 Указатель для буфера 3.
#2E38 SECT_L Указатель для буфера L.
#2E3A SECT_S Указатель для буфера S.
#2E3C SECT_F Указатель для буфера F.
#2E3E SECT_Z Номер родительской директории.

4.4.7 Переменные вывода на ленту (Output tape), 10 байт

#2E40 S_FLAG Флаг.
#2E40 S_FLAG Первый сектор.
#2E43 S_DIRN Номер директории.
#2E45 S_PNTR Указатель записи.
#2E47 Не используется.
#2E48 S_DEVN Код устройства.
#2E49 S_DRVN Номер привода.

4.4.8 Переменные для ввода с ленты (Input tape), 10 байт

#2E4A L_FLAG Флаг.
#2E4B L_FSEC Первый сектор.
#2E4D L_FPNT Указатель записи.
#2E4F L_LENL Длина (младшая часть).
#2E51 L_LENH Длина (старшая часть).
#2E52 L_DEVN Код устройства.
#2E53 L_DRVN Номер привода.

4.4.9 Переменные снапшота (10 байт)

#2E54 Z_FLAG Флаг.
#2E55 Z_FSEC Первый сектор.
#2E57 TMP_HL Временное хранилище.
#2E59 TMP_AD Регистры HL.
#2E5B Z_TYPE Тип снапшота.
#2E5C Z_DEVN Код устройства.
#2E5D Z_DRVN Номер привода.

4.4.10 Указатель на буфер принтера (2 байта)

#2E5E PBF_PT

4.4.11 Дескриптор файлового устройства (16 байт)

#2E60 N_DESC Тип файла.
#2E6B N_HNDL Handle файла.
#2E6D N_FLEN Длина файла.

4.4.12 Вспомогательная переменная (Auxiliary), 4 байта

#2E70 AX_FLG Флаги.
#2E71 AX_CMD Управление.
#2E72 AX_ERR Ошибка.
#2E73 Станция.

4.4.13 Номер блока Flash-привода (6 байт)

#2E74 BLK_LO Младшее слово.
#2E76 BLK_HI Старшее слово.
#2E78 DAT_LN Длина данных.

4.4.14 Параметры для места назначения файла операции Copy/Rename (5 байт)

#2E7A DST_TY Тип файла.
#2E7B DST_LN Длина файла.
#2E7D DST_AD Адрес файла.

4.4.15 Временный буфер для имени файла (11 байт)

#2E7F TMP_TY Тип.
#2E80 TMP_NA Имя.

4.4.16 Место для записи директории (6 байт)

#2E8A D_NUMB Номер директории.
#2E8C D_SECT Номер сектора.
#2E8E D_PNTR Указатель.

4.4.17 Внутренний стек (48 байт)

#2E90 ST_BOT Нижняя граница стека.

4.4.18 Буфер принтера (64 байта)

#2EC0 PR_BUF

4.4.19 Буфер страницы (256 байт)

#2F00 PAGE_B

4.5 Буферы секторов (4 килобайта)

4.5.1 Буферы секторов

#3000 BUFF_0 Главный сектор.
#3200 BUFF_1 Выделение памяти.
#3400 BUFF_A Альтернативная таблица FAT.
#3600 BUFF_3 Рабочий буфер.
#3700 BUFF_P Буфер POKE.
#3800 BUFF_L 'Input tape' (ввод с ленты).
#3A00 BUFF_S 'Output tape' (вывод на ленту).
#3C00 BUFF_F Основная таблица FAT.

4.5.2 Данные приложения (256 байт)

#3E00 AP_DAT

4.5.3 Текущая таблица директорий (256 байт)

В этой таблице хранится информация по последним 64 директориям блочного устройства.

#3F00 DIR_TB

[5. Файловые системы]

Реализованы две различные файловые системы:

- Блочные устройства (Block devices): память на flash-карте SD и диск в ОЗУ (RAM drive).
- Файловые устройства (File devices): компьютеры, на которых работает соответствующее приложение сервера.

5.1 Протокол обмена

К устройствам хранения осуществляется доступ через "запрос блоков" ('request blocks'), отправляемый периферийному контроллеру, который обрабатывает все низкоуровневые операции ввода/вывода. Структура блока команды следующая:

Байт № байта Описание
Заголовок 0 Байт команды: биты 0-3 параметр команды
                       биты 4-7 код команды
1 Управляющий байт: биты 0-2 номер станции
                               биты 3-7 флаги
2, 3 Длина данных n = 0-512.
Данные 4.. (n+4)  n байт данных.

После обработки этой команды периферийный контроллер посылает обратно блок ответа ('reply block'):

Байт № байта Описание
Заголовок 0 Код ошибки. Если 0, то ошибок не было.
1 Флаги.
2, 3 Длина данных n = 0-512.
Данные 4.. (n+4)  n байт данных ответа.

5.2 Устройства обмена данными (Communication devices)

Тот же самый протокол используется для обмена с устройствами, не являющимися устройствами хранения:

- Асинхронный последовательный порт
- Порт Ethernet

Протокол реализован для следующих команд:

Код Команда Параметр Данные Ответ
14 Передача последовательного порта 1 Данные  
14 Прием последовательного порта 2 Длина Данные
14 Передача Ethernet 3 Данные  
14 Прием Ethernet 4 Длина Данные
14 Соединение со станцией (Link station) 5 Имя/IP  
14 Проверка станции 6    

Команда передачи последовательного порта (параметр 1) посылает 1-512 байт данных. Максимальное количество байт, принимаемых последовательным портом, может быть указано (команда с параметром 2) длиной в диапазоне 1-256.

Длина данных для команд передачи и приема Ethernet ограничена 255 байтами. Для обмена данными через сеть IP у следующих команд имеется 4-байтное расширение заголовка:

'Write Block' (записать блок) байты 4-7: адрес
'Link station' (соединение со станцией) байт 4: номер станции
байт 5: 0
байты 6-7: идентификатор станции (Station ID)

5.3 Блочные устройства

Блочное устройство бывает следующих типов:

- Локальное, local (station 0): это встроенная карта памяти microSD или диск в ОЗУ (RAM drive).
- Сетевое, remote (station 1-7): карта microSD интерфейса станции, подключенного к сети IP. 

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-байтных спецификаторов файла:

Смещение Длина Описание
0 1 Тип файла
1 10 Имя файла
11 2 Первый сектор файла
13 3 Длина файла

Здесь байт #FF используется в качестве маркета окончания последовательности.

Размер директории/поддиректории ограничивается только доступным местом и глубиной дерева директорий. Максимальная длина имени пути ограничена 255 байтами.

Первый элемент первой записи директории имеет следующую структуру:

Смещение Длина Описание
0 1 Тип: 16
1 10 Имя директории
11 2 Первый сектор родительские директории или, или #00 #00 для корневой директории.
13 3 #00 #00 #00

Когда файл удален, его родительская директория уплотняется на 16 байт путем исправления соответствующей записи и сдвига всех остальных записей справа от записи удаленного файла.

5.3.2 Команды блочного устройства

Код Команда Параметр Данные Ответ
15 Основная команда 0 Команда Результат 
15 Проиграть tape-файл 3 Add (адрес), Len (длина), Typ (тип)  
15 Прием - запись 4 Адрес  
15 Установка адреса записи 5 Адрес  
15 Прочитать несколько блоков 6 Адрес  
15 Выровнять по началу блока 6    
15 Чтение - передача 7 Адрес  
15 Прочитать один блок 8 Адрес Сектор
15 Прочитать в буфер 9 Адрес  
15 Записать сектор 10 Сектор  
15 Записать из буфера 11 Адрес  
15 Идентифицировать карту 12   Идентификатор
15 Первый адрес стирания 13 Адрес  
15 Последний адрес стирания 14 Адрес  
15 Стереть блок 15    

5.3.3 Замечания

- 'Адрес' это 4-байтный номер сектора.

- Номер сектора с установленным самым старшим битом (31) интерпретируется как адрес диска ОЗУ (RAM drive).

- 'Идентификатор' это 8-байтная строка идентификатора карты, за которой следует 4-байтная емкость карты (последний номер сектора).

- 'Сектор' это блок данных из 512 байт.

- Запись сектора требует 2 шагов:

1. Указать номер сектора командой 'Установка адреса записи' (параметр 5).
2. Послать данные командой 'Записать сектор' (параметр 10).

- Команда 'Записать из буфера' (11) запишет сектор, который был ранее прочитан предыдущей командой 'Прочитать в буфер' (9).

- Стирание блока (erase) требует 3 шагов:

1. Указать начало блока командой 'Первый адрес стирания' (13).
2. Указать конец блока командой 'Последний адрес стирания' (14).
3. Послать команду 'Стереть блок' (15), чтобы реально выполнилось стирание блока.

- Команда 'Прием - запись' (4) отправляет команду 'Прочитать сектор' в файловое устройство, з записывает принятый блок по указанному адресу блочного устройства.

- Команда 'Чтение - передача' (7) читает блок по указанному адресу из блочного устройства и посылает его в файловое устройство выдачей команды 'Записать сектор' (10).

- После команды 'Прочитать несколько блоков' (6) поток байт может быть прочитан со скоростью инструкции INI (16 T-состояний), пока это не будет остановлено повторной выдачей команды (с произвольным адресом). Указатель чтения в любое время может быть переставлен на начало блока, если подать ту же самую команду без адреса.

- Команда 'Проиграть tape-файл' (3) нуждается в качестве данных:

Адрес первого сектора файла 4 байта
Длина файла 3 байта
Тип файла (#09 или #0A) 1 байт

5.3.4 Разделение больших последовательных файлов

Чтобы иметь возможность использовать файлы мультимедиа (типы 12-14) размером до 4 гигабайт, команда 3.1.7 может быть использована для резервирования < rsd > (1- 127) логических дисков, с целью разделение больших последовательных файлов, что также относится к пространству носителя данных карты SD, которое превышает максимальный размер тома 8 гигабайт.

Директория раздела сохраняется начиная с сектора 0 логического диска: (< размер тома в секторах >/65536 - < rsd > + 1), и распространяется на 4 сектора, так что может содержать максимум 128 записей следующей структуры:

Смещение Длина Описание
0 1 Тип файла (12-14)
1 10 Имя файла
11 2 #00 #00
13 3 Длина файла (в секторах)

Байт #FF обозначает конец записей. 

Это сопровождается файлами, сохраненными друг за другом в том порядке, в каком они появляются в директории.

Номер сектора первой записи файла должен быть вычислен парсингом директории и добавлением 4 + накопленная длина, предшествующая началу раздела. 

5.4 Файловые устройства

Файловое устройство может быть следующих видов: 

- Локальное (станция 0): это компьютер сервера, подключенный через порт USB.
- Сетевое (станции 1-7): машина сервера, подключенная через сеть.

5.4.1 Команды файлового устройства

Код Команда Параметр Данные Ответ
0 Закрыть файл Handle    
0 Открыть зарезервированный handle Handle Type (тип) Handle, Size
1 Прочитать сектор Handle   Сектор 
2 Записать сектор Handle Сектор  
3 Установить указатель в файле Handle Позиция  
3 Получить размер файла Handle   Размер файла
3 Получить handle info Handle Байт Handle, Size 
4 Создать временный файл Type (тип) Имя Handle, Size
5 Создать постоянный файл Type (тип) Имя Handle,Size
5 Зарезервировать handle 15 Имя Handle 
5 Получить длинное имя 1   Длинное имя 
5 Получить объем свободного места на диске 2   Свободное место
5 Прочитать клавиатуру и мышь 3   Пакет перемещения
5 Установить флаг перезаписи 4    
6 Открыть временный файл Type (тип) Имя Дескриптор
6 Открыть следующий файл 0-15   Дескриптор
7 Открыть постоянный файл Type (тип) Имя Дескриптор
8 Найти файл Type (тип) Имя Дескриптор
8 Найти следующий файл 0-15   Дескриптор
9 Удалить файл Type (тип) Имя  
9 Handle    
10 Переименовать файл Type (тип) Имя  
11 Копировать файл Type (тип) Имя  
12 Первый файл в списке 0 Имя Список
12 Первый BASIC-файл в списке 1 Имя Список
12 Первая строка длинного имени 2 Имя Строка
12 Следующий список файлов/строка 0-2   Список/строка
12 Получить абсолютный путь 3 Имя Путь
12 Получить текущий путь 3   Путь
12 Дамп OpSys 6 Сектор  
12 Загрузить OpSys 7   Сектор
12 Распечатать буфер 8 Буфер  
12 Основная команда 9 Команда Результат
12 Получить следующую строку 10   Type (тип), имя
12 Поиск со строки 10 Lin (строка) Pag (страница), Lin
12 Установить страницу 10 Dir (директория), Pag (страница) Информация о директории
12 Получить файл 11 Type (тип), имя Type (тип), имя
12 Получить новый список 12 Page (страница)  
12 Установить строку поиска 12 Строка  
12 Выбрать директорию 13 Имя  
12 Создать директорию 14 Имя  
12 Удалить директорию 15 Имя  
14 Принять-передать 0    

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-байтный дескриптор:

Смещение Длина Описание
0 1 Действительный тип файла (0-11)
1 10 Действительное имя файла
11 2 Недопустимый хендл файла (255)
13 3 Длина файла

5.4.4 Возврат команд 'Открыть временный файл', 'Открыть постоянный файл' и 'Открыть следующий файл'

Дескриптор, возвращаемый командой 'Open temporary|permanent [next] file', содержит также handle файла:

Смещение Длина Описание
0 1 Действительный тип файла (0-11)
1 10 Действительное имя файла
11 2 Хендл файла (0-15)
13 3 Длина файла

5.4.5 Возврат команд 'Создать временный файл' и 'Создать постоянный файл'

Хендл, который возвращают команды 'Create temporary|permanent file', это двухбайтный номер в диапазоне 0-15.

После команды 'Найти файл' или 'Открыть временный файл' последующая команда 'Найти следующий файл' или 'Открыть следующий файл' сделает попытку найти/открыть следующий файл, который совпадет с заданным именем.

5.4.6 Операция копирования/переименования (copy|rename) требует 2 шагов:

- Исходный файл находится выдачей команды 'Find [next] file' (Найти [следующий] файл).
- Имя назначения указывается командой 'Rename file' (Переименовать файл) или 'Copy file' (Копировать файл).

5.4.7 Список возврата команд 'Первый|Следующий список файлов'

Список, который возвращает команда 'First|Next file list', это последовательность 16-байтных дескрипторов файлов, как они возвращаются командой 'Find [next] file' (Найти [следующий] файл), с маркером #FF, обозначающим конец списка. Дескрипторы, которые возвращает команда 'First|Next BASIC file list' (Первый|Следующий список BASIC-файлов) для типов файлов 0-3, также содержат информацию из 9-байтного заголовка файлов BASIC:

Смещение Длина Описание
0 1 Тип файла (0-3)
1 10 Имя файла
11 1 Тип файла (из заголовка BASIC)
12 2 Длина файла
14 2 Номер строки запуска (для программы, Program), или имя массива (цифрового или строкового), или адрес загрузки (для двоичного кода, Code).

5.4.8 Возврат команд 'Первая строка длинного имени' и 'Следующий список файлов/строка'

Команды 'First long name line' и 'Next file list/line' возвращают то же самое, что и команды 'First directory list' и 'Next directory list' соответственно, но вернут один список директории в следующем формате:

Смещение Длина Описание
0 1 Буква типа файла
1 1 ' ', символ пробела
2 1-253 Длинное имя файла

[6. Hook-коды]

Ниже в таблице приведены hook-коды ZX INTERFACE 1.

Метка Адрес Описание
#1B WAI_KY #0103 Консольный ввод
#1C S_PRNT #0106 Консольный вывод
#1D BCHN_I #0109 Ввод RS232
#1E BCHN_O #010C Вывод RS232
#1F L_PRNT #010F Вывод на принтер
#20 TST_KY #0112 Опрос клавиатуры
#21 SET_DN #0115 Выбор привода
#22 OPN_CH #0118 Открыть канал
#23 CLO_CH #011B Закрыть канал
#24 ERAS_F #011E Удалить файл
#25 RD_SQE #0121 Последовательное чтение
#26 WR_SQE #0124 Последовательная запись
#27 RD_REC #0127 Чтение с произвольного места
#28 RD_CSC #012A Чтение сектора
#29 NX_CSC #012D Чтение следующего сектора
#2A WR_CSC #0130 Запись сектора
#2B CRE_CH #0133 Создать канал
#2C DEL_CH #0136 Удалить канал
#2D OPEN_N #0139 Открыть сетевой канал
#2E CLOS_N #013C Закрыть сетевой канал
#2F GET_PK #013F Получить пакет
#30 SND_PK #0142 Отправить пакет
#31 PA_INI #0145 Создать системные переменные
#32 EXEC_C #0148 Вызов подпрограммы теневого ПЗУ (shadow ROM)
#33   #014B Прочитать следующий заголовок - не реализовано
#34 OPEN_B #014E Открыть канал B

Дополнительные hook-коды:

Метка Адрес Описание
#35 RD_SEC #0151 Чтение сектора
#36 WR_SEC #0154 Запись сектора
#37 NEXT_R #015A Reclaim 'ad-hoc' channels
#39 FIND_F #015D Найти файл
#3A FILE_N #0160 Найти следующий файл
#3B OPEN_S #0163 Открыть поток
#3C CLOS_S #0166 Закрыть поток
#3D SAV_LD #0169 Сохранение, загрузка, проверка, слияние (SAVE / LOAD / VERIFY / MERGE)
#3E MOVE_E #016C Копирование файла или установка указателя в файле
#3F CAT_LG #016F Получение каталога директории
#40 FORM_T #0172 Формат привода (диска)
#41 CLR_SC #0175 Очистка экрана
#42 CLOS_A #0178 Закрыть все потоки
#43 SV_CMD #017B Пользовательская команда для периферийного устройства
#44 A_PATH #017E Получить абсолютный путь
#45 DIR_FL #0181 Получить первую страницу списка директории
#46 DIR_NL #0184 Получить следующую страницу списка директории
#47 PR_INT #0187 Печать 3-байтного целого числа
#48 SND_CM #018A Послать команду периферийному устройству
#49 RCV_CK #018D Передача-прием периферийного устройства
#4A DEV_PA #0190 Получить размер устройства
#4B ASY_RX #0193 Прием через асинхронный последовательный порт
#4C ASY_TX #0196 Передача через асинхронный последовательный порт
#4D GET_LN #0199 Чтение строки из канала M
#4E PUT_LN #019C Запись строки в канал M
#4F DV_PRE #019F Проверка наличия подключенного устройства
#50 NET_RX #01A2 Прием через Ethernet
#51 NET_TX #01A5 Передача через Ethernet
#52 LONG_N #01A8 Получить длинное имя

Здесь 'File type literal (буква типа файла) это символ, определенный в п. 3.4, 'Device type literal' (буква типа устройства) это символ, определенный в п. 3.2.

'Device code' (код устройства) это байт, определенный следующим образом:

Биты 0-2 Номер устройства (станции) в диапазоне 0-7
Бит 3 =0
Биты 4-6 Тип устройства, как определено в п. 3.2
Бит 7 =1

6.1 Консольный ввод (#1B)

6.1.1 Действие: ожидание нажатия на клавишу
6.1.2 Входные данные: отсутствуют
6.1.3 Выходные данные:
- (A) = код символа

6.2 Консольный вывод (#1C)

6.2.1 Действие: послать символ на экран
6.2.2 Входные данные:
- (A) = код символа
6.2.3 Выходные данные: отсутствуют

6.3 Ввод RS232 (#1D)

6.3.1 Действие: прием символа, поступающего снаружи, с таймаутом после 1 секунды
6.3.2 Входные данные: отсутствуют
6.3.3 Выходные данные:
- CY = принятый символ
- (A) = код символа

6.4 Вывод RS232 (#1E)

6.4.1 Действие: отправить символ наружу, с бесконечным ожиданием
6.4.2 Входные данные:
- (A) = код символа
6.4.3 Выходные данные: отсутствует

6.5 Вывод на принтер (#1F)

6.5.1 Действие: напечатать символ на принтере
6.5.2 Входные данные:
- (A) = код символа
6.5.3 Выходные данные: отсутствуют

6.6 Опрос клавиатуры (#20)

6.6.1 Действие: проверить, нажата ли клавиша
6.6.2 Входные данные: отсутствуют
6.6.3 Выходные данные:
- CY = нажатая клавиша

6.7 Выбор привода/диска (стандартного, legacy) (#21)

6.7.1 Действие: установить (A) в качестве текущего устройства (DEV_LT)
6.7.2 Входные данные:
- (A) = Номер привода/диска (1-255)
- (DEV_LT) = Буква типа устройства или код устройства
6.7.3 Выходные данные: отсутствуют

6.8 Открыть канал (#22)

6.8.1 Действие: открытие канала
6.8.2 Входные данные:

Файловый канал

- (A) = #BF (IN) - открыть для чтения
= #DE (OVER) - перезапись
= #DF (OUT) - открыть для записи
= #A5 (RND) - создать handle для файла
- (DRV_NR) = номер привода (диска) (1-255)
- (DEV_LT) = буква типа устройства или код устройства
- (NAM_LN) = длина имени файла (1-254)
- (FIL_TY) = буква типа файла
- (NAM_AD) = адрес имени файла (0-65535)

Не-файловый канал

- (DRV_NR) = номер станции (0-7) только для канала N
- (DEV_LT) = тип канала: B, T, N или U
- (NAM_LN) = недопустимая длина имени (0 или 255)

6.8.3 Выходные данные:
- (HL) = смещение канала
- (IX) = адрес дескриптора канала

6.9 Закрыть канал (#23)

6.9.1 Действие: закрытие канала
6.9.2 Входные данные:
- (IX) = Адрес дескриптора канала
6.9.3 Выходные данные: отсутствуют

6.10 Удалить файл (#24)

6.10.1 Действие: удаляет файл
6.10.2 Входные данные:
Параметры файла, указанные дескриптором или хендлом.

Дескриптор:

- (DRV_NR) = номер привода (1-255)
- (DEV_LT) = буква тип устройства или код устройства
- (NAM_LN) = длина имени файла (1-254)
- (FIL_TY) = буква типа файла
- (NAM_AD) = адрес имени файла (0-65535)

Handle:

- (STR_NR) = handle (0-15)
- (NAM_LN) = недопустимая длина имени (0 или 255)

6.10.3 Выходные данные: отсутствуют

6.11 Последовательное чтение (#25)

6.11.1 Действие: прочитать следующую запись
6.11.2 Входные данные:
- (IX) = Адрес дескриптора канала
6.11.3 Выходные данные: отсутствуют

6.12 Последовательная запись (#26)

6.12.1 Действие: записать текущую запись
6.12.2 Входные данные:
- (IX) = Адрес дескриптора канала
6.12.3 Выходные данные: отсутствуют

6.13 Прочитать запись (#27)
6.13.1
 Действие: прочитать следующую запись
6.13.2 Входные данные:
- (IX) = Адрес дескриптора канала
6.13.3 Выходные данные: отсутствуют

6.14 Прочитать сектор (legacy, стандартная операция) (#28)
6.14.1 
Действие: прочитать сектор CHREC в буфер канала
6.14.2 Входные данные:
- (IX) = Адрес дескриптора канала
6.14.3 Выходные данные:

6.15 Прочитать следующий сектор (legacy, стандартная операция) (#29)
6.15.1
 Действие: прочитать следующий сектор в буфер канала
6.15.2 Входные данные:
- (IX) = Адрес дескриптора канала
6.15.3Выходные данные:

6.16 Записать сектор (legacy, стандартная операция) (#2A)
6.16.1 
Действие: запись буфера канала в сектор CHREC
6.16.2 Входные данные:
- (IX) = Адрес дескриптора канала
6.16.3Выходные данные:

6.17 Создать канал (#2B)
6.17.1
Действие: Создание дескриптора канала
6.17.2 Входные данные:

Файловый канал

- (A) = #BF (IN) - открыть для чтения
= #DE (OVER) - перезаписать
= #DF (OUT) - открыть для записи
= #A5 (RND) - создать handle файла
- (DRV_NR) = номер привода (диска) (1-255)
- (DEV_LT) = буква типа устройства или код устройства
- (NAM_LN) = длина имени файла (1-254)
- (FIL_TY) = буква типа файла
- (NAM_AD) = адрес имени файла (0-65535)

Не файловый канал

- (DRV_NR) = номер станции (0-7), только для канала N
- (DEV_LT) = тип канала: B, T, N или U
- (NAM_LN) = недопустимая длина имени (0 или 255)

6.17.3 Выходные данные:
- (HL) = смещение канала
- (IX) = адрес дескриптора канала

6.18 Удалить канал (#2C)
6.18.1
Действие: удаляет дескриптор канала
6.18.2 Входные данные:
- (IX) = адрес дескриптора канала
6.18.3 Выходные данные: отсутствуют

6.19 Открыть сетевой канал (#2D)
6.19.1
Действие: создает канал типа N
6.19.2 Входные данные: отсутствуют
6.19.3 Выходные данные:
- (HL) = смещение канала
- (IX) = адрес дескриптора канала

6.20 Закрыть сетевой канал (#2E)
6.20.1 Действие: отправляет буферизированные данные и удаляет канал N
6.20.2 Входные данные: дескриптор
- (IX) = адрес дескриптора канала
6.20.3 Выходные данные: отсутствуют

 

6.21 Получить пакет (#2F)
6.21.1 Действие: принимает пакет из 255 байт в канал N channel с таймаутом в 1 секунду
6.21.2 Входные данные:
- (IX) = адрес дескриптора канала
6.21.3 Выходные данные:
- CY = произошел таймаут

6.22 Послать пакет (#30)
6.22.1 Действие: отправляет пакет максимум из 255 байт из канала N, без таймаута (с бесконечным ожиданием)
6.22.2 Входные данные:
- (IX) = адрес дескриптора канала
6.22.3 Выходные данные:

6.23 Создать системные переменные (#31)
6.23.1 Действие: создает системные переменные
6.23.2 Входные данные: отсутствуют
6.23.3 Выходные данные: отсутствуют

6.24 Выполнить код (#32)
6.24.1 Действие: запустить код по адресу (HD__11)
6.24.2 Входные данные:
- (HD__11) = Адрес исполняемого кода
6.24.3 Выходные данные: отсутствуют

6.25 Прочитать следующий заголовок (#33)
6.25.1 Действие: не реализовано
6.25.2 Входные данные: отсутствуют
6.25.3 Выходные данные: отсутствуют

6.26 Создать канал типа B (#34)
6.26.1 Действие: создает канал B
6.26.2 Входные данные: отсутствуют
6.26.3 Выходные данные:
- (HL) = смещение канала
- (IX) = адрес дескриптора канала

6.27 Прочитать сектор (#35)
6.27.1 Действие: читает сектор в буфер. Это не применимо к файловым устройствам
6.27.2 Входные данные:
- (BC) = номер сектора (0-65535)
- (HL) = адрес буфера (0-65535)
Если CY сброшен:
- (A) = Номер привода (диска) (0-65535)
- (DEV_LT) = Буква типа устройства или код устройства
6.27.3 Выходные данные: отсутствуют

6.28 Записать сектор (#36)
6.28.1 Действие: записывает сектор из буфера. Это не применимо к файловым устройствам
6.28.2 Входные данные:
- (BC) = номер сектора (0-65535)
- (HL) = адрес буфера (0-65535)
Если CY сброшен:
- (A) = Номер привода (диска) (0-65535)
- (DEV_LT) = Буква типа устройства или код устройства
6.28.3 Выходные данные: отсутствуют

6.29 Следующий сектор (#37)
6.29.1 Действие: найти номер сектора следующей записи файла
- Первоначально должно быть вызвано с (BC)=0, чтобы сбросить (flush) буфер FAT на диск. Не применимо к файловым устройствам
6.29.2 Входные данные:
- (BC) = номер сектора (0-65535)
Если CY сброшен:
- (A) = Номер привода (диска) (0-65535)
- (DEV_LT) = Буква типа устройства или код устройства
6.29.3 Выходные данные:
- Установлен флаг нуля (Z) = нет больше записей
- (BC) = следующий номер сектора (0-65535)

6.30 Отменить (reclaim) все 'ad-hoc' каналы (#38)
6.30.1 Действие: отменяет все каналы, не связанные с потоками
6.30.2 Входные данные: отсутствуют
6.30.3 Выходные данные: отсутствуют

6.31 Найти файл (#39)
6.31.1 Действие: ищет файл или директорию
6.31.2 Входные данные: параметры файла, указанные дескриптором или handle

Дескриптор:

- (DRV_NR) = номер привода (диска) (0-65535)
- (DEV_LT) = буква типа устройства или код устройства
- (NAM_LN) = длина имени файла (1-254)
- (FIL_TY) = буква типа файла
- (NAM_AD) = адрес имени файла (0-65535)

Handle:

- (STR_NR) = Handle (0-15)
- (NAM_LN) = недопустимая длина имени (0 или 255)

6.31.3 Выходные данные:
- CY = файл не найден
- (HL) = указатель на дескриптор файла

6.32 Найти следующий файл (#3A)
6.32.1
Действие: поиск следующего файла с именем, совпадающим с указанным ранее в вызове 'Найти файл'
6.32.2 Входные данные: отсутствуют
6.32.3 Выходные данные:
- CY = файл не найден
- (HL) = указатель на дескриптор файла

6.33 Открыть поток (#3B)
6.33.1 Действие: открывает поток или handle
6.33.2 Входные данные:

Файловый канал

- (A) = #BF (IN) - открыть для чтения
= #DE (OVER) - перезапись
= #DF (OUT) - открыть для записи
= #A5 (RND) - создать handle файла
- (DRV_NR) = номер привода (диска) (0-65535)
- (STR_NR) = поток или число handle (0-15)
- (DEV_LT) = буква типа устройства или код устройства
- (NAM_LN) = длина имени файла (1-254)
- (FIL_TY) = буква типа файла
- (NAM_AD) = адрес имени файла (0-65535)

Не файловый канал

- (DRV_NR) = номер станции (0-7), только для канала N
- (STR_NR) = номер потока (0-15)
- (DEV_LT) = тип канала: B, T, N или U
- (NAM_LN) = недопустимая длина имени (0 или 255)

6.33.3 Выходные данные: отсутствуют.

6.34 Закрыть поток (#3C)
6.34.1 Действие: закрывает поток или handle
6.34.2 Входные данные:
- (A) = поток или число handle (0-15)
6.34.3 Выходные данные: отсутствуют

6.35 SAVE / LOAD (#3D)
6.35.1 Действие:
- Читает (LOAD) или записывает (SAVE) содержимое памяти из файла или в файл.
- Создает директорию (SAVE) или меняет текущую директорию (LOAD).
- Закрывает файл входной ленты (input tape), файл выходной ленты (output tape) или файл снапшота (snapshot file).
6.35.2 Входные данные:

Тип операции:

- (A) = 0,4 - SAVE, очищается указатель файла и выполняется сохранение
= 1,5 - LOAD, очищается указатель файла и выполняется загрузка
= 2,6 - VERIFY, очищается указатель файла и выполняется операция сравнения
= 3,7 - MERGE, очищается указатель файла и выполняется слияние
= 8 - закрытие выходной ленты (output tape)
= 9 - закрытие входной ленты (input tape)
= 10 - закрыть файл снапшота

Параметры файла, указанные дескриптором или через handle

Дескриптор:

- (DRV_NR) = номер привода (диска) (0-65535)
- (DEV_LT) = буква типа устройства или код устройства
- (NAM_LN) = длина имени файла (1-254)
- (FIL_TY) = буква типа файла
= BASIC и стандартные типы (см. п. 3.4.1 - 3.4.2) только для типа данных 7, иначе произойдет переназначение типа данных
= Типы эмулятора (п. 3.4.3) переназначают типы данных, отличающиеся от 7
- (NAM_AD) = адрес имени файла (0-65535)

Handle:

- (STR_NR) = хендл (0-15)
- (NAM_LN) = недопустимая длина имени (0 или 255)

Код типа данных
- (HD__00) = 0-7, то же самое значение, как и у типа файла (см. п. 3.4)

Параметры программы BASIC, только для типов данных: 0
- (HD__11) = номер строки программы для автозапуска

Параметры массива BASIC, только для типов данных 1 и 2
- (HD__0F) = Имя массива ("a"-"z").

Адрес блока памяти, только для типов данных 3-7
- (HD__0D) = Адрес блока памяти.

Длина блока памяти, только для типов данных 3-7
- (HD__0B) = Длина блока памяти.

Файловый указатель, только для типов данных 4-7
- (HD__0F) = указатель записи (0-511)
- (HD__11) = номер записи (0-32767)

Этот указатель автоматически обновляется после операции.

6.35.3 Выходные данные: отсутствуют

6.36 Копировать (copy) / переименовать (rename) файл (#3E)
6.36.1 Действие: копирует или переименовывает файлы / переименовывает директорию
6.36.2 Входные данные:

Тип операции (только для двух файловых каналов):

- (A) = #CC (TO) - Copy
= #AC (AT) - Rename
= #DE (OVER) - Copy Overwrite (копирование с перезаписью)
= #BF (IN) - Rename Overwrite (переименование с перезаписью)
= #D5 (MERGE) - добавить (слияние)

Источник: указывается потоком или каналом

Поток:

- (STR_NR) = номер потока (0-15)
- (NAM_LN) = недопустимая длина имени (0 или 255)

Файловый канал:

- (DRV_NR) = номер привода (диска) (0-65535)
- (STR_NR) = 255
- (DEV_LT) = буква типа устройства или код устройства
- (NAM_LN) = длина имени файла (1-254)
- (FIL_TY) = буква типа файла
- (NAM_AD) = адрес имени файла (0-65535)

Не файловый канал:

- (DRV_NR) = номер станции (0-7), только для канала N
- (STR_NR) = 255
- (DEV_LT) = тип канала: B, T, N или U
- (NAM_LN) = недопустимая длина имени (0 или 255)

Место назначения, указанное потоком или файловым дескриптором

Поток:

- (STR_N2) = номер потока (0-15)
- (NAM_L2) = недопустимая длина имени (0 или 255)

Файловый канал:

- (DRV_N2) = номер привода (диска) (0-65535)
- (STR_N2) = 255
- (DEV_L2) = буква типа устройства или код устройства
- (NAM_L2) = длина имени файла (1-254)
- (FIL_T2) = буква типа файла
- (NAM_A2) = адрес имени файла (0-65535)

Не файловый канал:

- (DRV_N2) = номер станции (0-7), только для канала N
- (STR_N2) = 255
- (DEV_L2) = тип канала: B, T, N или U
- (NAM_L2) = недопустимая длина имени (0 или 255)

6.36.3 Выходные данные: отсутствуют

6.37 Получить файловый указатель (#3E)
6.37.1 Действие: получить файловый указатель для каналов M или H, к которым открыт указанный поток
6.37.2 Входные данные:
- (A) = тип операции: #B0 (VAL)

Канал, указанный по его адресу или номеру потока

Адрес канала:
- (STR_NR) = недопустимый номер потока (16-255)
- (IX) = адрес канала (0-65535)

Номер потока:
- (STR_NR) = номер потока (0-15)

6.37.3 Выходные данные:
Номер канала:
- (HD__0F) = указатель записи (0-511)
- (HD__11) = номер записи (0-32767)

6.38 Установить файловый указатель (#3E)
6.38.1 Действие: устанавливает файловый указатель канала M или H, к которому открыт указанный поток
6.38.2 Входные данные:
- (A) = тип операции: #A9 (POINT)

Канал, указанный по его адресу или номеру потока

Адрес канала:
- (STR_NR) = недопустимый номер потока (16-255)
- (IX) = адрес канала (0-65535)

Номер потока:
- (STR_NR) = номер потока (0-15)

Номер канала:
- (HD__0F) = указатель записи (0-511)
- (HD__11) = номер записи (0-32767)

6.38.3 Выходные данные: отсутствуют

6.39 Каталог (#3F)
6.39.1 Действие: генерирует каталог файлов
6.39.2 Входные данные:
- (DRV_NR) = номер привода (диска) (0-65535)
- (STR_NR) = номер потока (0-15)
- (DEV_LT) = буква типа устройства или код устройства
- (NAM_LN) = недопустимая длина имени (0 или 255)

Может быть указано имя директории или имени файла, чтобы использовать их как фильтр для вывода команды.

- (NAM_LN) = длина имени (1-254)
- (FIL_TY) = буква типа файла
- (NAM_AD) = адрес имени (0-65535)

6.39.3 Выходные данные:
- (HD_0D) = количество каталогизируемых файлов

Накопленная длина каталогизируемых файлов
- (HD_0F) = младшее слово
- (HD_11) = старшее слово

6.40 Формат логического привода/диска (#40)
6.40.1 Действие: выполняет форматирование логического привода. Это не применимо к файловым устройствам
6.40.2 Входные данные:
- (A) = номер привода (диска) (0-65535)
- (STR_NR) = размер кластера: 2, 4, 8 или 16
- (DEV_LT) = буква типа устройства или код устройства

или

- (A) = 0
- (STR_NR) = количество зарезервированных логических приводов
- (DEV_LT) = буква типа устройства или код устройства

6.40.3 Выходные данные: отсутствуют

6.41 Очистка экрана (#41)
6.41.1
Действие: то же самое, что и команда 'CLS #' операционной системы extended BASIC
6.41.2 Входные данные: отсутствуют
6.41.3 Выходные данные: отсутствуют

6.42 Закрыть все потоки (#42)
6.42.1 Действие: то же самое, что и команда 'CLEAR #' операционной системы extended BASIC
6.42.2 Входные данные: отсутствуют
6.42.3 Выходные данные: отсутствуют

6.43 Команда периферийного модуля (#43)
6.43.1 Действие: отправляет команду серверу или периферийному контроллеру, и печатает ответ в виде hex-дампа
6.43.2 Входные данные:
- (BC) = длина строки команды
- (HL) = адрес строки команды
- ZR = сервер/периферийный модуль
- CY = печать hex-дампа
6.43.3 Выходные данные: отсутствуют

6.44 Получить абсолютный путь (#44)
6.44.1 Действие: получает параметры абсолютного имени пути
6.44.2 Входные данные:
- (DRV_NR) = номер привода (диска) (0-65535)
- (DEV_LT) = буква типа устройства или код устройства

Относительное имя пути

- (NAM_LN) = длина имени файла (1-254) или 0 для текущей директории
- (NAM_AD) = адрес имени файла (0-65535)

6.44.3 Выходные данные: абсолютный путь в BUFF_3 (см. п. 4.5.1)
- (HL) = адрес абсолютного имени файла
- (BC) = длина абсолютного имени файла

6.45 Получить первый список директории (строка) (#45)
6.45.1 Действие: получает первый список директории или строку списка, как это указано п. 5.4.7 и п. 5.4.8
6.45.2 Входные данные:
- (A) = тип списка, только для файловых устройств
= 0 обычный список файлов
= 1 с информацией заголовка BASIC
= 2 строка списка с длинным именем
- (DRV_NR) = номер привода (диска) (0-65535)
- (DEV_LT) = буква типа устройства или код устройства

Относительный путь

- (NAM_LN) = длина имени директории (1-254) или 0 для текущей директории
- (NAM_AD) = адрес имени директории (0-65535)

6.45.3 Выходные данные: первый список директории/строка в BUFF_3
- (HL) = адрес первого списка/строки
- (BC) = длина списка/строки
- (DE) = 0 для корневой (root) директории

6.46 Получить следующий список директории (строка) (#46)
6.46.1 Действие: получить следующий список директории или строку списка
6.46.2 Входные данные: отсутствуют
6.46.3 Выходные данные: следующий список директории/строка в BUFF_3
- (HL) = адрес следующего списка директории/строки
- (BC) = длина списка/строки

6.47 Печать целого числа (#47)
6.47.1 Действие: вывести 3-байтное целое число (A) (DE) в 3, 6 или 8 цифрах, с лидирующими пробелами
6.47.2 Входные данные:
- (DE) = младшие байты
- (A) = старший байт
- Флаги, указывающие количество цифр, и опции count и add:

Z CY Ширина Для чего используется
0 0 3 Номер привода (диска)
0 1 6 Адрес
1 0 8 Длина файла
1 1 8 Длина файла с опциями count и add

6.47.3 Выходные данные: если установлены оба ZR и CY, то печатаемые цифры считаются в (HD__0D), и их сумма вычисляется в (HD__0F и HD__11).

6.48 Команда периферийного устройства (#48)
6.48.1 Действие: контроллеру периферийного устройства посылается только код команды
6.48.2 Входные данные:
- (A) = код команды
- (HL) = адрес ответа (0-65535)
6.48.3 Выходные данные:
- CY = ошибка
- (A) = код ошибки или 0, если нет ошибки
- (HL) = адрес ответа

6.49 Передача-прием периферийного устройства (#49)
6.49.1 Действие: отправка и прием данных в периферийный контроллер и из него
6.49.2 Входные данные:
- (A) = код команды
- (HL) = адрес блока данных (0-65535)
- (BC) = длина блока данных (0-512)
- (DE) = адрес ответа (0-65535)
6.49.3 Выходные данные:
- (A) = код ошибки
- (HL) = адрес ответа
- (BC) = длина ответа

6.50 Получить размер устройства (#4A)
6.50.1 Действие: получить параметры текущего устройства
6.50.2 Входные данные: отсутствуют
6.50.3 Выходные данные:
- (H) = доступный размер тома в логических приводах (дисках)
- (L) = количество зарезервированных логических приводов (дисков) или #FF для RAM-диска или файловых устройств
- (BC) = реальный размер карты SD, в логических дисках

6.51 Прием последовательного порта (#4B)
6.51.1 Действие: прием в буфер из порта RS-232

Эта функция имеет таймаут 1 секунду, после истечения которого будет возвращено 0 байт

6.51.2 Входные данные:
- (C) = количество байт (1-256)
- (HL) = адрес буфера (0-65535)
6.51.3 Выходные данные:
- (C) = количество принятых байт (0-240)

6.52 Передача последовательного порта (#4C)
6.52.1 Действие: передает из буфера в через порт RS-232

Эта функция имеет таймаут после 12 секунд, после истечения которого выдается сигнал 'Communication error' (ошибка обмена).

6.52.2 Входные данные:
- (BC) = количество байт (1-512)
- (HL) = адрес буфера (0-65535)
6.52.3 Выходные данные: отсутствуют

6.53 Чтение строки из канала M (#4D)
6.53.1 Действие: читает строку, завершенную CR (#0D), если CY сброшен, или иначе читает блок максимум (BC) байт из канала M по адресу (IX) в буфер по адресу (DE)
6.53.2 Входные данные:
- (IX) = адрес канала
- (BC) = максимальное количество байт (0-65536)
- (DE) = адрес буфера (0-65535)
- CY = не проверять конец строки (CR)
6.53.3 Выходные данные:
- флаг Z установлен, если (BC) = 0
- (BC) = количество прочитанных байт (1-65536)

6.54 Запись строки в канал M (#4E)
6.54.1 Действие: записывает строку, завершенную CR (#0D), если CY сброшен, или иначе максимум (BC) байт из буфера по адресу (HL) в канал M по адресу (IX)
6.54.2 Входные данные:
- (IX) = адрес канала
- (BC) = максимальное количество байт (0-65536)
- (HL) = адрес буфера (0-65535)
- CY = не проверять на конец строки (CR)
6.54.3 Выходные данные: отсутствуют

6.55 Проверка наличия устройства (#4F)
6.57.1 Действие: проверяет, подключено ли устройство (A)
6.55.2 Входные данные:
- (A) = код устройства
6.55.3 Выходные данные:
- ZR = устройство присутствует
- CY = блочное устройство

6.56 Прием через Ethernet (#50)
6.56.1 Действие: принимает блок максимум (C) байт из станции (A). Сработает таймаут после 12 секунд
6.56.2 Входные данные:
- (A) = номер станции (1-7)
- (C) = количество байт (1-255)
- (HL) = адрес буфера (0-65535)
6.56.3 Выходные данные:
- CY = произошел таймаут
- (C) = количество байт received (0-255)

6.57 Передача Ethernet (#51)
6.57.1 Действие: передает блок максимум 255 байт в станцию (A). Сработает таймаут после 12 секунд
6.57.2 Входные данные:
- (A) = номер станции (1-7)
- (C) = количество байт (1-255)
- (HL) = адрес буфера (0-65535)
6.57.3 Выходные данные:
- CY = произошел таймаут

6.58 Получить длинное имя (#52)
6.58.1 Действие: получает длинное имя последнего найденного файла на файловом устройстве, или содержимое последнего найденного 'LNF' auxiliary-файла на блочном устройстве. Результат отправляется в буфер (HL).
6.58.2 Входные данные:
- (HL) = адрес буфера (0-65535)
6.58.3 Выходные данные:
- CY = ошибка - имя не было возвращено

[Ссылки]

1. Interface 1bis for the Sinclair ZX Spectrum 48k Ver 4b-4c Operating system reference site:sites.google.com.
2. Interface 1bis для ZX Spectrum.
3161010IF1bis.zip - документация, относящаяся к Interface 1bis.
4. Звуковой порт вывода tape-файлов Interface 1bis.