Здесь приведен перевод документации [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) структурировано следующим образом:
< 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), потому что указатель всегда автоматически нормализуется:
Начальный символ '*', за которым не идет буква типа устройства, означает "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)
Канал 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 байт).
Файлы 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)
У двоичных файлов нет какой-то определенной структуры.
'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, за исключением следующих:
заменено на "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.
Список файлов, который выводит оператор 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 байт)
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.
Пользовательская команда для периферийного устройства
#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.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Выходные данные: отсутствуют
- (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.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) = указатель на дескриптор файла
- (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Входные данные:
Параметры файла, указанные дескриптором или через 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)
Этот указатель автоматически обновляется после операции.
- (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 = ошибка - имя не было возвращено