====== MSX BDOS ====== ~~TOC_HERE~~ ~~TOC 1-3 wide~~ %%BDOS%% — Basic Disk Operating System (Базовая Дисковая Операционная Система) ''MSXDOS.SYS'' это интерфейс между программой пользователя и дисковыми функциями ROM. Кроме дисковых функций он включает в себя и некоторые базовые функции ввода/вывода для работы с другими устройствами, в частности, с консолью. Часть этих функций выполняется при помощи обращений к [[msx:bios|ROM MSX BIOS]], а часть выполняется непосредственно программами %%MSX-DOS Kernel%%, которые находятся в памяти постоянно. Этими же функциями пользуется и ''COMMAND.COM''. По большей части, вектор встроенных вызовов ''MSXDOS.SYS'' совместим с [[cp_m:|]], что позволяет запускать в [[msx:dos:|]] программы, написанные для [[cp_m:|]] без изменений, но, кроме этого, ''MSXDOS.SYS'' включает в себя и некоторые дополнительные функции, которых в [[cp_m:|]] нет. В частности, работу с датами и временем. Вектор обращений к функциям ''MSXDOS.SYS'' занимает в оперативной памяти адреса 0x0000–0x0100 и совпадает с [[cp_m:|]], а сами исполняемые программы находятся в верхней области памяти. Адреса ОЗУ между 0x0100 и верхней [[msx:bios#work_area|рабочей областью]] ''MSXDOS.SYS'' называются "транзитной областью" (TPA — transient program area) и предоставляются программам пользователя. Подробнее от TPA написано [[msx:dos:#tpa|здесь]]. Вектор переходов в [[msx:bios#work_area|рабочую область]], находящуюся на 3–й странице оперативной памяти (0x0С00–0xFFFF), удобен также и тем, что эта страница остаётся в RAM при межслотовых обращениях к [[msx:bios|BIOS]], [[msx:bios#sub-rom|SUB-ROM]] и [[msx:bios#disk-rom|DISK-ROM]], которые обычно находятся в нулевых страницах памяти других слотов. ---- Выражаем огромную благодарность А.Б. Родионову на предоставленную информацию! {{anchor:entry_points}} ====== Входные точки ====== Форма описания: |<100% 5% 95%>| ^Номер|Имя выполняемой функции| |Функция|Выполняемая функция| |Вход|Входные параметры| |Выход|Возвращаемые значения| |Совместимость|Существует ли совместимость с [[cp_m:|]]| Пример вызова: |Из [[msx:dos:|]]: LD C,#** CALL #0005 |Из [[msx:disk_basic|]]: LD C,#** CALL #F37D | |где ''%%**%%'' — номер функции.|| ===== Функции, обозначенные "NO FUNCTION" возвращают 0 в регистре A. ===== |<100% 5% 95%>| ^00|SYSTEM RESET| |Если [[msx:dos:|]], то переход по адресу 0000; иначе, осуществляется "тёплый" старт [[msx:disk_basic|]].|| |Вход |Нет| |Выход|Нет| |Совместимость|Есть| ^01|CONSOLE INPUT| |Функция|Ввод символа с клавиатуры. \\ Если нажато CTRL+c, то выполняет функцию 00; \\ если CTRL+P, то начинается выдача эхо–сигналов на печать; \\ если CTRL+N, то прекращает выдачу эхо–сигналов на печать. \\ Вводимый символ отображается на экране.| |Вход|Нет| |Выход|Регистр А содержит ASCII символ, введённый с клавиатуры.| |Совместимость|Есть| ^02|CONSOLE OUTPUT| |Функция|Вывод ASCII символа из регистра Е на экран терминала.| |Вход|В регистре Е содержится код выводимого ASCII символа.| |Выход|Нет| |Совместимость|Есть| ^03|AUX INPUT| |Функция|Ввод символа с устройства AUX (вспомогательное устройство, напр. принтер или драйвер диска).| |Вход|Нет| |Выход|Регистр А содержит ASCII символ, введённый с устройства AUX.| |Совместимость|Есть| ^04|AUX OUTPUT| |Функция|Вывод символа на устройство AUX.| |Вход|В регистре Е содержится код выводимого ASCII символа.| |Выход|Нет| |Совместимость|Есть| ^05|LST OUTPUT| |Функция|Вывод на печать ASCII символа из регистра Е.| |Вход|В регистре Е содержится код выводимого ASCII символа.| |Выход|Нет| |Совместимость|Есть| ^06|DIRECT CONSOLE I/O| |Функция|Если в Е находится 0xFF, то \\Если нет ввода с клавиатуры, то возвращает 0. \\ Иначе, возвращает код. \\ Нет эхо–символов. Не фиксируются управляющие коды CTRL+*. \\ Иначе, вывод символа из регистра Е на экран.| |Вход|Е: определяет функцию ввода или вывода, а также хранит код выводимого символа (если вывод).| |Выход|А: если ввод, то содержит код введённого символа.| |Совместимость|Есть| ^07|DIRECT INPUT| |Функция|Ввод символа с клавиатуры. \\ Нет эхо–символов. \\ Не фиксируются управляющие коды CTRL+*.| |Вход|Нет| |Выход|А: содержит код введённого символа.| |Совместимость|Нет (чтение байта ввода/вывода)| ^08|DIRECT INPUT| |Функция|Ввод символа с клавиатуры. \\ Фиксируются управляющие коды CTRL+c, CTRL+p, CTRL+n.| |Вход|Нет| |Выход|А: содержит код введённого символа.| |Совместимость|Нет (установка байта ввода/вывода)| ^09|STRING OUTPUT| |Функция|Вывод строки, начальный адрес которой указывает пара \\ DE, до символа '$' если он встретится в этой строке.| |Вход|DE: содержит адрес первого символа строки.| |Выход|Нет| |Совместимость|Есть| ^0А|BUFFERED INPUT| |Функция|Ввод строки с клавиатуры до возврата каретки. \\ Первый символ строки заносится по адресу [DE+2]. \\ По адресу [DE+1] заносится число введённых символов строки (не считая кодов LF и CR). \\ По адресу [DE] хранится максимальное число символов в строке, которое может быть введено.| |Вход|DE: определяет адрес буфера, отводимого на хранение вводимой строки. \\ [DE]: определяет максимальное количество символов, которое может быть введено (от 0 до 255).| |Выход|Нет| |Совместимость|Есть| ^0B|CONSOLE STATUS| |Функция|Если нет ввода с клавиатуры, то возвращает 0; иначе, возвращает 0xFF.| |Вход|Нет| |Выход|А: содержит состояние клавиатуры: 0 или 0xFF.| |Совместимость|Есть| ^0C|GET VERSION NUMBER| |Функция|Определение номера версии.| |Вход|Нет| |Выход|HL содержит номер версии (H: 0; L: 0x22)| |Совместимость|Есть| ^0D|DISK RESET| |Функция|Устанавливает драйвер диска по умолчанию (А:) \ Устанавливает адрес передачи равным 0x80. \\ Стирает все сектора, которые были изменены, но не были записаны на диск.| |Вход|Нет| |Выход|Нет| |Совместимость|Есть| ^0E|SELECT DISK| |Функция|Устанавливает драйвер диска по умолчанию ( 0 соответствует устройству А: ).| |Вход|Е содержит номер драйвера диска.| |Выход|Нет| |Совместимость|Есть| ^0F|OPEN FILE| |Функция|Открывает файл, определяемый Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. \\ Поле размера записи, поле текущего блока, поле текущей записи и поле записи прямого доступа будут установлены после выполнения функции. Поле размера файла, поля даты и времени создания, поле идентификатора устройства (ID), поле расположения каталога, поле первого кластера, поле последнего кластера и поле последнего доступного кластера копируются из каталога. \\ Если функция выполнилась, то возвращает 0; иначе, — 0xFF.| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если файл открылся; 0xFF, в противном случае| |Совместимость|Есть| ^10|CLOSE FILE| |Функция|Закрывает файл, определяемый Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. \\ Если функция выполнилась, то возвращает 0; иначе, — 0xFF.| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если файл закрылся; 0xFF, в противном случае| |Совместимость|Есть| ^11|SEARCH FIRST| |Функция|Поиск первого появления файла, определяемого Блоком Управления Файлом (FCB), начальный адрес которого содержится в DE. \\ Если файл найден, входная точка каталога (32 байта) копируется по адресу передачи, возвращается 0; \\ иначе, возвращает 0xFF. \\ __//Примечание//__: В имени файла возможны спец. символы (* и ?).| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если файл найден; 0xFF, в противном случае| |Совместимость|Есть| ^12|SEARCH NEXT| |Функция|Поиск следующего появления файла, определённого последним вызовом функции SEARCH FIRST. \\ Если файл найден, входная точка каталога (32 байта) копируется по адресу передачи, возвращается 0; \\ иначе, возвращает 0xFF. \\ __//Примечание//__:В имени файла возможны спец. символы (* и ?).| |Вход|Нет| |Выход|A: 0, если файл найден; 0xFF, в противном случае| |Совместимость|Есть| ^13|DELETE FILE| |Функция|Стирает файл, определяемый Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. \\ Если функция выполнилась, то возвращает 0; иначе, — 0xFF. \\ __//Примечание//__: В имени файла возможны спец. символы (* и ?).| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если файл был удалён; 0xFF, в противном случае| |Совместимость|Есть| ^14|SEQUENTAL READ| |Функция|Читает запись файла, определяемого Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. Передаёт прочитанную запись по адресу передачи. Запись определяется полем текущего блока и полем текущей записи. Поля текущего блока и текущей записи увеличиваются на 1 при выходе из функции. Размер записи всегда равен 128 байтам. \\ Если функция выполнилась, то возвращает 0; иначе, — 1. \\ __//Примечание//__: Эта функция оставлена для совместимости с [[cp_m:|]]. Настоятельно рекомендуется использовать другую функцию: ''[[#RANDOM BLOCK READ]]''.| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если чтение выполнилось; 1, в противном случае| |Совместимость|Есть| ^15|SEQUENTAL WRITE| |Функция|Посылает запись в файл, определяемый Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. Запись определяется полем текущего блока и полем текущей записи. Поля текущего блока и текущей записи увеличиваются на 1 при выходе из функции. Размер записи всегда равен 128 байтам. \\ Если функция выполнилась, то возвращает 0; иначе, — 1. \\ __//Примечание//__: Эта функция оставлена для совместимости с [[cp_m:|]]. Настоятельно рекомендуется использовать другую функцию: ''[[#RANDOM BLOCK WRITE]]''.| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если запись выполнена; 1, в противном случае| |Совместимость|Есть| ^16|CREATE FILE| |Функция|Открывает файл, определяемый Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. Если данный файл уже существует, то он стирается. \\ Поле размера записи, поле текущей записи, поле текущего блока и поле записи произвольного доступа устанавливаются после выполнения этой функции. \\ Если функция выполнилась, то возвращает 0; иначе, — 0xFF.| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если файл открылся; 0xFF, в противном случае| |Совместимость|Есть| ^17|RENAME FILE| |Функция|Меняет имя файла, определяемого Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE, на имя файла, определяемое Блоком Управления Файлом (FCB), начальный адрес которого содержится в (DE+16). \\ Если функция выполнилась, то возвращает 0; иначе, — 0xFF. \\ __//Примечание//__: В имени файла возможны спец. символы (* и ?).| |Вход|DE: указывает на первый байт FCB старого файла (DE+16): указывает на первый байт FCB нового файла| |Выход|A: 0, если файл переименовался; 0xFF, в противном случае| |Совместимость|Есть| ^18|GET LOGIN VECTOR| |Функция|Возвращает таблицу битов для включённых устройств (вектор начального состояния системы). \\ В отличии от [[cp_m:|]], все системные устройства включены.| |Вход|Нет| |Выход|HL: содержит вектор начального состояния системы| |Совместимость|Есть| ^19|GET DEFAULT DRIVE NAME| |Функция|Возвращает имя устройства по умолчанию.| |Вход|Нет| |Выход|А: имя (номер) устройства по умолчанию| |Совместимость|Есть| ^1А|SET DMA ADDRESS| |Функция|Устанавливает адрес передачи.| |Вход|DE: устанавливаемый (новый) адрес передачи| |Выход|Нет| |Совместимость|Есть| ^1B|GET ALLOCATION| |Функция|Возвращает информацию о драйвере, определённом в регистре Е, если имя драйвера правильное; иначе, возвращает 0xFF.| |Вход|Е: имя драйвера| |Выход|А: число секторов на кластер или 0xFF (при неудаче); \\ Если А: не 0xFF: \\ BC: размер сектора (байт); \\ DE: число кластеров на диске; \\ HL: число свободных кластеров;\\ IX: указатель Блока Параметров Драйвера (Drive Parameter Block — DPB); \\ IY: указатель Таблицы Расположения Файла (File Allocation Table — FAT). |Совместимость|Нет (чтение адреса расположения)| ===== Системные вызовы для CP/M версии 2.0 и более поздних ===== |<100% 5% 95%>| ^1C|NO FUNCTION| |Совместимость|Нет (установка вектора защиты записи)| ^1D|NO FUNCTION| |Совместимость|Нет (чтение вектора защиты записи)| ^1Е|NO FUNCTION| |Совместимость|Нет (установка атрибутов файла)| ^1F|NO FUNCTION| |Совместимость|Нет (чтение адреса параметров диска)| ^20|NO FUNCTION| |Совместимость|Нет (установка/чтение кода пользователя)| ^21|RANDOM READ| |Функция|Чтение записи файла, определяемого Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. Запись переносится по адресу передачи. Запись определяется полем блока произвольного доступа. Это поле не изменяется при выполнении данной функции. Размер записи всегда 128 байт. \\ Если функция выполнилась, то возвращает 0; иначе, — 1. \\ __//Примечание//__: Эта функция оставлена для совместимости с [[cp_m:|]]. Настоятельно рекомендуется использовать другую функцию: ''[[#RANDOM BLOCK READ]]''.| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если запись прочиталась; 1, в противном случае| |Совместимость|Есть| ^22|RANDOM WRITE| |Функция|Посылает запись в файл, определяемый Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. Запись переносится, начиная с адреса передачи. Запись определяется полем блока произвольного доступа. Это поле не изменяется при выполнении данной функции. Размер записи всегда 128 байт. \\ Если функция выполнилась, то возвращает 0; иначе, — 1. \\ __//Примечание//__: Эта функция оставлена для совместимости с [[cp_m:|]]. Настоятельно рекомендуется использовать другую функцию: ''[[#RANDOM BLOCK WRITE]]''.| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если запись осуществилась; 1, в противном случае| |Совместимость|Есть| ^23|GET FILE SIZE| |Функция|Вычисляет размер файла (кратное число блоков по 128 байт), определяемого Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. Устанавливает размер файла в поле записи произвольного доступа. \\ Если функция выполнилась, то возвращает 0; иначе, — 0xFF.| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если размер получен; 0xFF, в противном случае| |Совместимость|Есть| ^24|SET RANDOM RECORD| |Функция|Вычисляет текущую позицию записи по полю текущего блока и полю полю текущей записи данного Блока Управления Файлом (FCB), начальный адрес которого содержится в DE. Устанавливает позицию записи в поле записи прямого доступа данного FCB.| |Вход|DE: указывает на первый байт FCB| |Выход|Нет| |Совместимость|Есть| ===== Системные вызовы для CP/M версии 2.2 и более поздних ===== |<100% 5% 95%>| ^25|NO FUNCTION| |Совместимость|Нет (сброс драйвера диска)| ^26|{{anchor:random_block_write}} RANDOM BLOCK WRITE| |Функция|Посылает запись (записи) в файл, определяемый Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. Запись переносится, начиная с адреса передачи. Запись определяется полем блока произвольного доступа. Поле записи прямого доступа автоматически увеличивается при успешном исходе операции. Размер записи определяется полем размера записи. \\ Количество записей определяет содержимое пары HL. \\ Если функция выполнилась, то возвращает 0; иначе, — 1.| |Вход|DE: указывает на первый байт FCB \\ HL: указывает количество последовательных записей| |Выход|A: 0, если запись осуществилась; 1, в противном случае| |Совместимость|Нет (NO FUNCTION)| ^27|{{anchor:random_block_read}} RANDOM BLOCK READ| |Функция|Читает запись (записи) из файла, определяемого Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. Запись переносится, по адресу передачи. Запись определяется полем блока произвольного доступа. Поле записи прямого доступа автоматически увеличивается при успешном исходе операции. Размер записи определяется полем размера записи. \\ Количество записей определяет содержимое пары HL. \\ Количество прочитанных записей после завершения операции заносится в пару HL. \\ Если функция выполнилась, то возвращает 0; иначе, — 1.| |Вход| DE: указывает на первый байт FCB \\ HL: указывает количество последовательных записей| |Выход|A: 0, если запись осуществилась; 1, в противном случае HL: указывает количество прочитанных записей| |Совместимость|Нет (NO FUNCTION)| ^28|RANDOM WRITE WITH ZERO FILL| |Функция|Посылает запись в файл, определяемый Блоком Управления Файлом (File Control Block — FCB), начальный адрес которого содержится в DE. Запись переносится, начиная с адреса передачи. Запись определяется полем блока произвольного доступа. Это поле не изменяется данной операцией. Размер записи всегда равен 128 байт. Если файл расширяется, то все записи, которые не заносятся, заполняются нулями. \\ Если функция выполнилась, то возвращает 0; иначе, — 1.| |Вход|DE: указывает на первый байт FCB| |Выход|A: 0, если запись осуществилась; 1, в противном случае| |Совместимость|Есть| ===== Системные вызовы только для MSX DOS ===== Системные вызовы только для [[msx:dos:|]] |<100% 5% 95%>| ^29|NO FUNCTION| |Совместимость|Нет| ^2A|{{anchor:get_date}} GET DATE| |Функция|Возвращает дату.| |Вход|Нет| |Выход|HL: год \\ D: месяц \\ E: день \\ А: день недели| |Совместимость|Нет| |2B|SET DATA| |Функция|Устанавливает дату. Если успешно, то возвращает 0; иначе, — 0xFF.| |Вход|Аналогичен выходу для функции ''[[#GET DATE]]''| |Выход|A: 0, если дата установилась; 0xFF, в противном случае| |Совместимость|Нет| ^2C|{{anchor:get_time}} GET TIME| |Функция|Возвращает время.| |Вход|Нет| |Выход|H: часы \\ L: минуты \\ D: секунды \\ E: 1/100 секунды| |Совместимость|Нет| ^2D|SET TIME| |Функция|Устанавливает время. Если успешно, то возвращает 0; \\ иначе, — 0xFF.| |Вход|Аналогичен выходу для функции ''[[#GET TIME]]''| |Выход|A: 0, если дата установилась; 0xFF, в противном случае| |Совместимость|Нет| ^2E|SET/RESET VERIFY FLAG| |Функция|Установка/сброс флага "чтение после записи".| |Вход|Е: 0 (флаг сбрасывается); не 0 (флаг устанавливается)| |Выход|Hет| |Совместимость|Нет| ^2F|ABSOLUTE DISK READ| |Функция|Чтение Н секторов, начиная с сектора с логическим номером DE, с драйвера, определяемого регистром L. Данные записываются в память, начиная с адреса передачи.| |Вход|DЕ: логический номер сектора \\ Н: количество секторов для чтения \\ L: спецификация драйвера| |Выход| Нет| |Совместимость|Нет| ^30|ABSOLUTE DISK WRITE| |Функция|Запись Н секторов, начиная с сектора с логическим номером DE, с драйвера, определяемого регистром L. Данные переписываются из памяти, начиная с адреса передачи.| |Вход|DЕ: логический номер сектора \\ Н: количество секторов для чтения \\ L: спецификация драйвера| |Выход|Нет| |Совместимость|Нет| ====== Ссылки ====== [[https://konamiman.github.io/MSX2-Technical-Handbook/md/Chapter3.html#figure-32--msxdossys|CHAPTER 3 - MSX-DOS | MSX2-Technical-Handbook]] [[https://hansotten.file-hunter.com/uploads/files/bdos.txt|BDOS routines + addresses]] [[http://atmturbo.nedopc.com/inf/bios_cpm.htm#2|BIOS&BDOS of CP/M — 2. Характеристики DOS]] {{tag>MSX Norm}}