# 3. DSS/ESTEX — дисковая подсистема ## 3.1 Общие сведения DSS (Disk SubSystem) / ESTEX — расширение BIOS для работы с дисковой подсистемой, файловой системой, памятью, клавиатурой и экраном. | Свойство | Значение | |----------|----------| | Способ вызова | `RST 10h` | | Номер функции | Регистр **C** | | Успех | CF=0, выходные данные в регистрах | | Ошибка | CF=1, код ошибки в **A** | | Стек | Обязательно в `#8000..#BFFF` (W2) | Документирован в версиях: | Версия | Источник | Особенности | |--------|----------|-------------| | v1.54 | ProgrammerManual.txt | Одна из первых; нумерация файловых функций 10h–1Fh | | v1.55 | ProgrammerManual.txt (приложение) | Переименование FREEMEM→INFOMEM, RETMEM→FREEMEM | | v1.6 | DiskSyscalls.txt | Нумерация файловых функций 0Ah–1Fh; добавлены 0Ch/0Dh | | v1.60 | DSS 1.60 rst 10.txt | Уточнения; добавлены 0Ch/0Dh, SET_CACHE_FLAG, RESET_CACHE_FLAG | | v1.71 | Исходный код DSS 1.71 | BETA; добавлены SCANDRV, LIB_SUB; удалены 0Ch/0Dh/34h; версия D=01h, E=71 | > **Смена нумерации между v1.54 и v1.6:** в v1.54 файловые функции занимали диапазон 10h–1Fh (OPEN=10h, CLOSE=11h, READ=12h…). Начиная с v1.6 они смещены — CREATE=0Ah, OPEN=11h. В данном справочнике описана версия **DSS 1.71** (исходный код), с указанием отличий от v1.54–v1.60 где применимо. --- ## 3.2 Системные и дисковые функции (00h–0Fh) ### 00h — VERSION Версия DSS. | | Регистр | Описание | |--|---------|----------| | Вход | C | `00h` | | Выход | D | Номер версии (DSS 1.71: 1) | | Выход | E | Модификация (DSS 1.71: 71) | | Выход | BC | Номер сборки (build) | | Выход | HL | `0` (зарезервировано) | ### 01h — CHDISK Смена текущего диска. | | Регистр | Описание | |--|---------|----------| | Вход | C | `01h` | | Вход | A | Номер диска (0=A, 1=B…) | | Выход (CF=0) | A | Максимальный номер диска (4 для дисков A–E) | | Выход (CF=1) | A | Код ошибки | ### 02h — CURDISK Номер текущего диска. | | Регистр | Описание | |--|---------|----------| | Вход | C | `02h` | | Выход (CF=0) | A | Текущий номер диска (0=A, 1=B…) | | Выход (CF=1) | A | Код ошибки | > **v1.54:** ошибка не возвращается (нет механизма CF=1). Добавлено в v1.6. ### 03h — DSKINFO Информация о диске. | | Регистр | Описание | |--|---------|----------| | Вход | C | `03h` | | Вход | A | Номер диска (0=A, 1=B… `0FFh` = текущий) | | Выход (CF=0) | A | Размер кластера в секторах | | Выход (CF=0) | HL | Общее количество кластеров | | Выход (CF=0) | DE | Количество свободных кластеров | | Выход (CF=0) | BC | Размер сектора в байтах | | Выход (CF=1) | A | Код ошибки | > Слоты `04h–07h` — зарезервированы (заглушки NOPS в DSS 1.71). ### 08h — SCANDRV (DSS 1.71) Пересканирование драйверов устройств. Обновляет список доступных логических дисков. | | Регистр | Описание | |--|---------|----------| | Вход | C | `08h` | | Выход (CF=0) | A | Количество найденных логических дисков | | Выход (CF=1) | A | Ошибка (KERNEL_PANIC если boot-диск потерян) | Функция отсутствует в документации v1.54–v1.60. Впервые реализована в DSS 1.71. ### 09h — BOOTDSK Номер системного диска (с которого загружена ОС). | | Регистр | Описание | |--|---------|----------| | Вход | C | `09h` | | Вход | B | `0` | | Выход (CF=0) | A | Номер системного диска (0=A, 1=B…) | | Выход (CF=1) | A | Код ошибки | > **v1.54:** B не указан; ошибка не возвращается. ### 0Ah — CREATE Создание файла (с перезаписью существующего). | | Регистр | Описание | |--|---------|----------| | Вход | C | `0Ah` | | Вход | HL | Указатель на файловую спецификацию | | Вход | A | Атрибут файла | | Выход (CF=0) | A | Файловый манипулятор (handle) | | Выход (CF=1) | A | Код ошибки | **v1.54:** CREATE находится на `C=18h`. Номер `0Ah` в v1.54 занят другой функцией. ### 0Bh — CREATE_NEW Создание нового файла (только если не существует). | | Регистр | Описание | |--|---------|----------| | Вход | C | `0Bh` | | Вход | HL | Указатель на файловую спецификацию | | Вход | A | Атрибут файла | | Выход (CF=0) | A | Файловый манипулятор | | Выход (CF=1) | A | Код ошибки | Если файл уже существует — возвращает ошибку. ### 0Ch — SET_CACHE_FLAG (v1.60, удалена в DSS 1.71) Установка флага кэш-памяти. | | Регистр | Описание | |--|---------|----------| | Вход | C | `0Ch` | | Выход (CF=0) | A | Номер страницы для сохранения переключателя | | Выход (CF=1) | — | Ошибка | Функция присутствовала в DSS v1.60. В DSS 1.71 заменена на заглушку (возвращает `INVALID_FUNCTION`). ### 0Dh — RESET_CACHE_FLAG (v1.60, удалена в DSS 1.71) Сброс флага кэш-памяти. | | Регистр | Описание | |--|---------|----------| | Вход | C | `0Dh` | | Выход (CF=1) | — | Ошибка | В DSS 1.71 заменена на заглушку (возвращает `INVALID_FUNCTION`). ### 0Eh — DELETE Удаление файла. | | Регистр | Описание | |--|---------|----------| | Вход | C | `0Eh` | | Вход | HL | Указатель на файловую спецификацию | | Выход (CF=1) | A | Код ошибки | > **v1.54** дополнительно требует A = атрибут файла. В v1.6/v1.60 атрибут не используется — HL только. --- ## 3.3 Файловые функции (10h–1Fh) ### 10h — RENAME Переименование файла. | | Регистр | Описание | |--|---------|----------| | Вход | C | `10h` | | Вход | HL | Указатель на старое имя | | Вход | DE | Указатель на новое имя | | Выход (CF=1) | A | Код ошибки | ### 11h — OPEN Открытие существующего файла. | | Регистр | Описание | |--|---------|----------| | Вход | C | `11h` | | Вход | HL | Указатель на файловую спецификацию | | Вход | A | Режим доступа: `0` = чтение/запись, `1` = чтение, `2` = запись | | Выход (CF=0) | A | Файловый манипулятор | | Выход (CF=1) | A | Код ошибки | ### 12h — CLOSE Закрытие файла. | | Регистр | Описание | |--|---------|----------| | Вход | C | `12h` | | Вход | A | Файловый манипулятор | | Выход (CF=1) | A | Код ошибки | ### 13h — READ Чтение из файла. | | Регистр | Описание | |--|---------|----------| | Вход | C | `13h` | | Вход | A | Файловый манипулятор | | Вход | HL | Адрес буфера в памяти | | Вход | DE | Количество читаемых байт | | Выход (CF=0) | DE | Реально прочитано байт | | Выход (CF=0) | A | `0` = прочитаны все байты, `0FFh` = прочитано меньше | | Выход (CF=1) | A | Код ошибки | ### 14h — WRITE Запись в файл. | | Регистр | Описание | |--|---------|----------| | Вход | C | `14h` | | Вход | A | Файловый манипулятор | | Вход | HL | Адрес данных в памяти | | Вход | DE | Количество записываемых байт | | Выход (CF=0) | DE | Реально записано байт | | Выход (CF=1) | A | Код ошибки | ### 15h — MOVE_FP Перемещение файлового указателя. | | Регистр | Описание | |--|---------|----------| | Вход | C | `15h` | | Вход | A | Файловый манипулятор | | Вход | HL:IX | Смещение | | Вход | B | Способ: `0` = от начала, `1` = от текущей, `2` = от конца | | Выход (CF=0) | HL:IX | Новая позиция указателя | | Выход (CF=1) | A | Код ошибки | ### 16h — ATTRIB Получение/изменение атрибута файла. | | Регистр | Описание | |--|---------|----------| | Вход | C | `16h` | | Вход | HL | Указатель на файловую спецификацию | | Вход | B | `0` = получить атрибут, `1` = установить | | Вход | A | Атрибут (для установки) | | Выход (CF=0) | A | Атрибут файла | | Выход (CF=1) | A | Код ошибки | ### 17h — GET_D_T Дата и время файла. | | Регистр | Описание | |--|---------|----------| | Вход | C | `17h` | | Вход | A | Файловый манипулятор | | Выход (CF=0) | D | День | | Выход (CF=0) | E | Месяц | | Выход (CF=0) | IX | Год | | Выход (CF=0) | H | Час | | Выход (CF=0) | L | Минуты | | Выход (CF=0) | B | Секунды | | Выход (CF=1) | A | Код ошибки | ### 18h — PUT_D_T Установка даты и времени файла. | | Регистр | Описание | |--|---------|----------| | Вход | C | `18h` | | Вход | A | Файловый манипулятор | | Вход | D | День | | Вход | E | Месяц | | Вход | IX | Год | | Вход | H | Час | | Вход | L | Минуты | | Вход | B | Секунды | | Выход (CF=1) | A | Код ошибки | ### 19h — F_FIRST Поиск первого файла по маске. | | Регистр | Описание | |--|---------|----------| | Вход | C | `19h` | | Вход | HL | Указатель на файловую спецификацию (с маской `*`/`?`) | | Вход | DE | Рабочий буфер: 44 байта (B=0) или 256 байт (B=1) | | Вход | A | Атрибуты для поиска | | Вход | B | `0` = имя в формате 11 байт "FilenameExt", `1` = "filename.ext",0 | | Выход (CF=1) | A | Код ошибки | После успешного поиска имя первого совпавшего файла — в буфере DE. ### 1Ah — F_NEXT Поиск следующего файла (после F_FIRST). | | Регистр | Описание | |--|---------|----------| | Вход | C | `1Ah` | | Вход | DE | Рабочий буфер (тот же, что в F_FIRST) | | Выход (CF=1) | A | Код ошибки (0Fh = No more files) | ### 1Bh — MKDIR Создание каталога. | | Регистр | Описание | |--|---------|----------| | Вход | C | `1Bh` | | Вход | HL | Указатель на путь | | Выход (CF=1) | A | Код ошибки | ### 1Ch — RMDIR Удаление каталога (каталог должен быть пуст). | | Регистр | Описание | |--|---------|----------| | Вход | C | `1Ch` | | Вход | HL | Указатель на путь | | Выход (CF=1) | A | Код ошибки | ### 1Dh — CHDIR Смена текущего каталога. | | Регистр | Описание | |--|---------|----------| | Вход | C | `1Dh` | | Вход | HL | Указатель на путь | | Выход (CF=1) | A | Код ошибки | ### 1Eh — CURDIR Получение текущего каталога. | | Регистр | Описание | |--|---------|----------| | Вход | C | `1Eh` | | Вход | HL | Буфер (256 байт) | | Выход (CF=1) | A | Код ошибки | --- ## 3.4 Дата и время (20h–22h) ### 21h — SYSTIME Текущие дата и время системы. | | Регистр | Описание | |--|---------|----------| | Вход | C | `21h` | | Выход | D | День | | Выход | E | Месяц | | Выход | IX | Год | | Выход | H | Час | | Выход | L | Минуты | | Выход | B | Секунды | | Выход | C | День недели (0=воскресенье) | ### 22h — SETTIME Установка даты и времени. | | Регистр | Описание | |--|---------|----------| | Вход | C | `22h` | | Вход | D | День | | Вход | E | Месяц | | Вход | IX | Год | | Вход | H | Час | | Вход | L | Минуты | | Вход | B | Секунды | | Выход (CF=1) | A | Код ошибки | --- ## 3.5 Функции клавиатуры (30h–37h) ### 30h — WAITKEY Ожидание и получение символа с клавиатуры (блокирующий). | | Регистр | Описание | |--|---------|----------| | Вход | C | `30h` | | Выход | A | Код символа (позиционный/скан-код) | | Выход | D | Позиционный код | | Выход | E | ASCII-код | | Выход | C | Режим клавиатуры (битовое поле, см. ниже) | | Выход | B | Состояние shift'ов (битовое поле) | **Регистр C (режим клавиатуры):** | Бит | Описание | |-----|----------| | 7 | RUS/LAT (0=LAT, 1=RUS) | | 3 | Num Lock | | 2 | Scroll Lock | | 1 | Insert | | 0 | Caps Lock | **Регистр B (состояние shift'ов):** | Бит | Описание | |-----|----------| | 7 | Left Shift | | 6 | Right Shift | | 5 | Ctrl | | 4 | Alt | | 3 | Left Ctrl | | 2 | Left Alt | | 1 | Right Ctrl | | 0 | Right Alt | ### 31h — SCANKEY Опрос клавиатуры без ожидания (неблокирующий). | | Регистр | Описание | |--|---------|----------| | Вход | C | `31h` | | Выход (ZF=1) | — | Нет нажатой клавиши | | Выход (ZF=0) | A | Код символа | | Выход (ZF=0) | D | Позиционный код | | Выход (ZF=0) | E | ASCII-код | | Выход (ZF=0) | C | Режим клавиатуры | | Выход (ZF=0) | B | Состояние shift'ов | Поля C и B — те же, что в WAITKEY. ### 32h — ECHOKEY Ожидание символа с эхо-печатью на экран. Вход/выход — полностью идентичен WAITKEY. ### 33h — CTRLKEY Получить состояние клавиатуры (без считывания символа). | | Регистр | Описание | |--|---------|----------| | Вход | C | `33h` | | Выход | A | `0` = нет символов в буфере | | Выход | C | Режим клавиатуры | | Выход | B | Состояние shift'ов | ### 35h — K_CLEAR Очистить буфер клавиатуры и выполнить подфункцию. | | Регистр | Описание | |--|---------|----------| | Вход | C | `35h` | | Вход | B | Номер подфункции: `30h`, `31h`, `32h`, `33h` или `34h` | | Выход | — | Зависит от подфункции (см. соответствующую функцию) | Перед вызовом указанной подфункции очищает буфер клавиатуры. Подфункция `34h` (EDIT) присутствовала в v1.54–v1.60, но в DSS 1.71 заменена на заглушку (NOPS). ### 36h — K_SETUP Управление настройками клавиатуры. **B = 0** — установить раскладку: | | Регистр | Описание | |--|---------|----------| | Вход | C | `36h` | | Вход | B | `0` | | Вход | A | Номер раскладки: `0`=normal, `1`=shift, `2`=caps, `3`=caps+shift, `4`..`7`=альтернативные | | Выход | — | — | **B = 1** — получить состояние звуковых переменных. **B = 2** — установить звуковые переменные: | | Регистр | Описание | |--|---------|----------| | Вход | C | `36h` | | Вход | B | `2` | | Вход | A | bit0 = сигнал переполнения буфера, bit1 = сигнал смены раскладки | ### 37h — TESTKEY Опрос буфера клавиатуры (неблокирующий, без снятия символа). | | Регистр | Описание | |--|---------|----------| | Вход | C | `37h` | | Выход (ZF=1) | — | Нет символов в буфере | | Выход (ZF=0) | A | Код символа | | Выход (ZF=0) | D | Позиционный код | | Выход (ZF=0) | E | ASCII-код | | Выход (ZF=0) | C | Режим клавиатуры | | Выход (ZF=0) | B | Состояние shift'ов | От SCANKEY отличается тем, что опрашивает буфер, а не физическую клавиатуру. --- ## 3.6 Управление памятью (38h–3Fh) ### 38h — SETWIN Подключение страницы памяти в произвольное окно. | | Регистр | Описание | |--|---------|----------| | Вход | C | `38h` | | Вход | A | Идентификатор блока памяти | | Вход | B | Номер страницы в блоке (0, 1, 2…) | | Вход | H | Биты 6–7: номер окна (0–3) | | Выход (CF=0) | A | Номер замещённой физической страницы | | Выход (CF=1) | A | Код ошибки | ### 39h — SETWIN1 Подключение страницы в окно 0 (`#0000..#3FFF`). | | Регистр | Описание | |--|---------|----------| | Вход | C | `39h` | | Вход | A | Идентификатор блока | | Вход | B | Номер страницы в блоке | | Выход (CF=0) | A | Номер замещённой страницы | | Выход (CF=1) | A | Код ошибки | ### 3Ah — SETWIN2 Подключение страницы в окно 1 (`#4000..#7FFF`). | | Регистр | Описание | |--|---------|----------| | Вход | C | `3Ah` | | Вход | A | Идентификатор блока | | Вход | B | Номер страницы в блоке | | Выход (CF=0) | A | Номер замещённой страницы | | Выход (CF=1) | A | Код ошибки | > **Опечатка в DiskSyscalls v1.6 и DSS 1.60:** обе ошибочно указывают `C=39h` для SETWIN2, что дублирует номер SETWIN1. Правильный номер — `3Ah` (согласно v1.54). ### 3Bh — SETWIN3 Подключение страницы в окно 2 (`#8000..#BFFF`). | | Регистр | Описание | |--|---------|----------| | Вход | C | `3Bh` | | Вход | A | Идентификатор блока | | Вход | B | Номер страницы в блоке | | Выход (CF=0) | A | Номер замещённой страницы | | Выход (CF=1) | A | Код ошибки | ### 3Ch — INFOMEM Информация о распределении памяти. | | Регистр | Описание | |--|---------|----------| | Вход | C | `3Ch` | | Выход | HL | Общее количество страниц (16 КБ каждая) | | Выход | BC | Количество свободных страниц | > v1.54 называет эту функцию **FREEMEM**. Переименована в INFOMEM начиная с v1.55, однако исходный код DSS 1.71 всё ещё использует метку `FREEMEM`. ### 3Dh — GETMEM Выделение блока памяти. | | Регистр | Описание | |--|---------|----------| | Вход | C | `3Dh` | | Вход | B | Размер блока в страницах (16 КБ каждая) | | Выход (CF=0) | A | Идентификатор блока | | Выход (CF=1) | A | Код ошибки (`1` = не хватает памяти) | ### 3Eh — FREEMEM Освобождение блока памяти. | | Регистр | Описание | |--|---------|----------| | Вход | C | `3Eh` | | Вход | A | Идентификатор блока | | Выход (CF=1) | A | Код ошибки | > v1.54 называет эту функцию **RETMEM**. Переименована в FREEMEM начиная с v1.55, однако исходный код DSS 1.71 всё ещё использует метку `RETMEM`. ### 3Fh — SETMEM Изменение размера блока памяти. | | Регистр | Описание | |--|---------|----------| | Вход | C | `3Fh` | | Вход | A | Идентификатор блока | | Вход | B | Новый размер в страницах | | Выход (CF=1) | A | Код ошибки | --- ## 3.7 Исполнение программ (40h–42h) ### 40h — EXEC Загрузка и выполнение EXE-файла. После завершения возвращает управление. | | Регистр | Описание | |--|---------|----------| | Вход | C | `40h` | | Вход | HL | Указатель на файловую спецификацию | | Вход | B | `0` = короткое имя, `1` = полный путь | | Выход (CF=0) | A | Код завершения программы | | Выход (CF=1) | A | Код ошибки | ### 41h — EXIT (метка в DSS 1.71: LEAVE) Завершение текущей программы. | | Регистр | Описание | |--|---------|----------| | Вход | C | `41h` | | Вход | B | Код завершения | | Выход (CF=0) | A | Код завершения | | Выход (CF=1) | A | Код ошибки | ### 42h — WAIT (метка в DSS 1.71: GET_ERR) Получить код завершения последней выполненной программы (после EXEC). | | Регистр | Описание | |--|---------|----------| | Вход | C | `42h` | | Выход | A | Код завершения | --- ## 3.8 Строки и командная строка (43h–45h) ### 43h — GSWITCH Выделение параметра из командной строки. | | Регистр | Описание | |--|---------|----------| | Вход | C | `43h` | | Вход | HL | Указатель на командную строку | | Вход | DE | Буфер для выделяемого параметра | | Выход | HL | Указатель на следующий параметр | | Выход | CF=0 | Есть ещё параметры | | Выход | CF=1 | Конец строки (в буфере — последний параметр или ноль) | ### 44h — DOSNAME Преобразование имени файла между форматами. **B = 0** — из 11-символьного в DOS ("FILENAMEEXT" → "filename.ext"): | | Регистр | Описание | |--|---------|----------| | Вход | C | `44h` | | Вход | B | `0` | | Вход | HL | 11 символов имени | | Вход | DE | Буфер для DOS-имени | **B = 1** — из DOS в 11-символьный: | | Регистр | Описание | |--|---------|----------| | Вход | C | `44h` | | Вход | B | `1` | | Вход | HL | Имя в формате DOS | | Вход | DE | Буфер (11 байт) | | Выход (CF=1) | A | Код ошибки | ### 45h — EXCMDLN (метка в DSS 1.71: EX_PATH) Разбор командной строки. Многорежимная функция. **Подфункция 0** — разобрать строку (определить, какие компоненты указаны): | | Регистр | Описание | |--|---------|----------| | Вход | C | `45h`, B=`0` | | Вход | HL | Указатель на командную строку | | Выход (CF=0) | A | Битовое поле: bit7=`*`/`?`, bit3=диск, bit2=путь, bit1=расширение, bit0=имя | | Выход (CF=1) | A | Код ошибки | **Подфункция 1** — выделить имя диска: | | Регистр | Описание | |--|---------|----------| | Вход | C | `45h`, B=`1` | | Вход | HL | Командная строка | | Вход | DE | Буфер (≤13 байт) | | Выход (CF=0) | A | Номер диска (0=A, 1=B…) | | Выход (CF=0) | DE | Буфер: `"A:",0` | **Подфункция 2** — выделить директорию: | | Регистр | Описание | |--|---------|----------| | Вход | C | `45h`, B=`2` | | Вход | HL | Командная строка | | Вход | DE | Буфер (≤256 байт) | | Выход (CF=0) | A | Результат разбора (как в подф. 0) | | Выход (CF=0) | DE | Буфер: `"DIR1\\DIR2\\",0` | **Подфункция 3** — выделить имя файла: | | Регистр | Описание | |--|---------|----------| | Вход | C | `45h`, B=`3` | | Вход | HL | Командная строка | | Вход | DE | Буфер (≤13 байт) | | Выход (CF=0) | A | Результат разбора | | Выход (CF=0) | DE | Буфер: `"FILE.EXT",0` | **Подфункция 4** — выделить расширение: | | Регистр | Описание | |--|---------|----------| | Вход | C | `45h`, B=`4` | | Вход | HL | Командная строка | | Вход | DE | Буфер (≤4 байта) | | Выход (CF=0) | A | Результат разбора | | Выход (CF=0) | DE | Буфер: `"TXT",0` или `"C ",0` | **Подфункция 5** — выделить все компоненты (диск, путь, имя, расширение): | | Регистр | Описание | |--|---------|----------| | Вход | C | `45h`, B=`5` | | Вход | HL | Командная строка | | Вход | DE | Буфер указателей (8 байт, 4 слова) | | Выход (CF=0) | A | Результат разбора | | Выход (CF=1) | A | Код ошибки | Буфер DE — 4 слова (адреса пользовательских буферов): | Смещение | Размер | Буфер | Максимум | |----------|--------|-------|----------| | DE+0 | 2 | Имя диска | 13 байт | | DE+2 | 2 | Директория | 256 байт | | DE+4 | 2 | Имя файла | 13 байт | | DE+6 | 2 | Расширение | 4 байта | > **Ошибка во всех источниках:** документация (v1.54, v1.6, v1.60) указывает смещения DE+3 и DE+4 для имени файла и расширения. Это накладывает их на одно слово (DE+3 находится внутри адреса директории). Правильные смещения — DE+4 и DE+6. **Подфункция 7** — выделить параметр командной строки: | | Регистр | Описание | |--|---------|----------| | Вход | C | `45h`, B=`7` | | Вход | HL | Командная строка (или указатель с предыдущего вызова) | | Вход | DE | Буфер для параметра | | Выход | HL | На следующий параметр | | Выход | CF=0 | Есть ещё | | Выход | CF=1 | Конец строки | **Подфункция 8** — 11-символьный → DOS (аналог DOSNAME B=0): | | Регистр | Описание | |--|---------|----------| | Вход | C | `45h`, B=`8` | | Вход | HL | 11 символов | | Вход | DE | Буфер для DOS-имени | | Выход (CF=1) | A | Код ошибки | **Подфункция 9** — DOS → 11-символьный (аналог DOSNAME B=1): | | Регистр | Описание | |--|---------|----------| | Вход | C | `45h`, B=`9` | | Вход | HL | Имя в формате DOS | | Вход | DE | Буфер (11 байт) | | Выход (CF=1) | A | Код ошибки | --- ## 3.9 Переменные окружения (46h–47h) ### 46h — ENVIRON Работа с системным окружением. **B = 0** — получить системное окружение целиком: | | Регистр | Описание | |--|---------|----------| | Вход | C | `46h`, B=`0` | | Вход | HL | Буфер | | Выход (CF=0) | DE | Конец буфера | **B = 1** — получить переменную окружения: | | Регистр | Описание | |--|---------|----------| | Вход | C | `46h`, B=`1` | | Вход | HL | Имя переменной | | Вход | DE | Буфер для значения | | Выход (CF=0) | A | `0` = найдена, `0FFh` = не найдена | **B = 2** — установить/удалить переменную: | | Регистр | Описание | |--|---------|----------| | Вход | C | `46h`, B=`2` | | Вход | HL | `"ИМЯ=значение"` (для удаления — `"ИМЯ="`) | | Выход (CF=0) | A | `0` = успех | | Выход (CF=1) | A | Код ошибки | ### 47h — APPINFO Информация о текущем приложении. **B = 0** — параметры командной строки: | | Регистр | Описание | |--|---------|----------| | Вход | C | `47h`, B=`0` | | Вход | HL | Буфер данных | | Выход (CF=1) | A | Код ошибки | **B = 1** — полный путь к каталогу программы: | | Регистр | Описание | |--|---------|----------| | Вход | C | `47h`, B=`1` | | Вход | HL | Буфер | | Выход (CF=1) | A | Код ошибки | **B = 2** — полный путь и имя файла программы: | | Регистр | Описание | |--|---------|----------| | Вход | C | `47h`, B=`2` | | Вход | HL | Буфер | | Выход (CF=1) | A | Код ошибки | --- ## 3.10 Экран (50h–5Ch) Функции экрана работают с текущим видеорежимом, установленным через SETVMOD. Для работы с окнами через BIOS см. `02-bios.md`. ### 50h — SETVMOD Установка видеорежима. | | Регистр | Описание | |--|---------|----------| | Вход | C | `50h` | | Вход | A | Режим: `02h`=текст 40×32×16, `03h`=текст 80×32×16, `81h`=графика 320×256×256, `82h`=графика 640×256×16 | | Вход | B | Страница экрана (0/1) | | Выход (CF=1) | A | Код ошибки | ### 51h — GETVMOD Текущий видеорежим. | | Регистр | Описание | |--|---------|----------| | Вход | C | `51h` | | Выход (CF=0) | A | Текущий режим | | Выход (CF=0) | B | Страница экрана | | Выход (CF=1) | A | Код ошибки | ### 52h — LOCATE Установка позиции курсора. | | Регистр | Описание | |--|---------|----------| | Вход | C | `52h` | | Вход | D | Строка | | Вход | E | Столбец | | Выход | — | — | ### 53h — CURSOR Текущая позиция курсора. | | Регистр | Описание | |--|---------|----------| | Вход | C | `53h` | | Выход | D | Строка | | Выход | E | Столбец | ### 54h — SELPAGE Выбор активной страницы экрана. | | Регистр | Описание | |--|---------|----------| | Вход | C | `54h` | | Вход | B | Страница экрана (0/1) | | Выход (CF=1) | A | Код ошибки | ### 55h — SCROLL Прокрутка окна. | | Регистр | Описание | |--|---------|----------| | Вход | C | `55h` | | Вход | D | Строка верхнего левого угла | | Вход | E | Столбец верхнего левого угла | | Вход | H | Высота | | Вход | L | Ширина | | Вход | B | `1` = вверх, `2` = вниз | | Вход | A | `0` = очищать освободившуюся строку | ### 56h — CLEAR Очистка области экрана. | | Регистр | Описание | |--|---------|----------| | Вход | C | `56h` | | Вход | D | Строка верхнего левого угла | | Вход | E | Столбец | | Вход | H | Высота | | Вход | L | Ширина | | Вход | B | Атрибут заполнения | | Вход | A | Символ заполнения | ### 57h — RDCHAR Чтение символа и атрибута с экрана. | | Регистр | Описание | |--|---------|----------| | Вход | C | `57h` | | Вход | D | Строка | | Вход | E | Столбец | | Выход | A | Символ | | Выход | B | Атрибут | ### 58h — WRCHAR Запись символа с атрибутом на экран. | | Регистр | Описание | |--|---------|----------| | Вход | C | `58h` | | Вход | D | Строка | | Вход | E | Столбец | | Вход | A | Символ | | Вход | B | Атрибут | ### 59h — WINCOPY Сохранение области экрана в буфер. | | Регистр | Описание | |--|---------|----------| | Вход | C | `59h` | | Вход | D | Строка | | Вход | E | Столбец | | Вход | H | Высота | | Вход | L | Ширина | | Вход | B | Страница буфера | | Вход | IX | Адрес буфера | ### 5Ah — WINREST Восстановление области экрана из буфера. Параметры — идентичны WINCOPY. ### 5Bh — PUTCHAR Печать символа в текущей позиции курсора. | | Регистр | Описание | |--|---------|----------| | Вход | C | `5Bh` | | Вход | A | Символ | Курсор сдвигается на одну позицию вправо. ### 5Ch — PCHARS Печать строки с текущей позиции курсора. Строка завершается нулём. ```asm LD HL,MSG LD C,5Ch RST 10h ; ... MSG: db "Hello, world!",0Dh,0Ah,0 ``` | | Регистр | Описание | |--|---------|----------| | Вход | C | `5Ch` | | Вход | HL | Адрес строки (завершается `0`) | ### 5Dh — LIB_SUB (DSS 1.71) Библиотечная подфункция. В текущей реализации DSS 1.71 содержит одну подфункцию: **B = 1** — восстановление системных шрифтов (SETUP_CURSORS): | | Регистр | Описание | |--|---------|----------| | Вход | C | `5Dh` | | Вход | B | `1` | | Выход | — | — | Функция в стадии развития — список подфункций пополняемый. --- ## 3.11 Принтер (5Fh) ### 5Fh — PRINT Вывод символа на принтер (без ожидания готовности). | | Регистр | Описание | |--|---------|----------| | Вход | C | `5Fh` | | Вход | A | Символ | | Выход | B | Символ (возвращается без изменений) | | Выход | CF=1 | Принтер не готов | --- ## 3.12 Системная консоль и командный интерпретатор DSS предоставляет командную строку через EXCMDLN (45h). Командный интерпретатор поддерживает внутренние команды: `DIR`, `ERA`/`DEL`, `REN`, `COPY`, `TYPE`, `MD`/`MKDIR`, `RD`/`RMDIR`, `CD`/`CHDIR`, `DATE`, `TIME`, `VER`, `FORMAT`, `LABEL`, `VOL`, `SYS`, и др. Загрузка `.EXE`-файлов: см. EXEC (40h). Переменные окружения: см. ENVIRON (46h). --- ## 3.13 Коды ошибок ESTEX | Код | Значение | |-----|----------| | 00h | Нет ошибки | | 01h–05h | Диск: не готов, не найден, защищён от записи, ошибка данных | | 06h | Ресурс не найден | | 08h | Файл не найден | | 09h | Путь не найден | | 0Ah | Нет доступа | | 0Bh | Invalid access code | | 0Ch | Invalid drive | | 0Dh | Unable to remove current directory | | 0Eh | Not same device | | 0Fh | No more files | | 10h–1Fh | Ошибки ввода-вывода | Коды `1Ch`, `1Dh`, `20h` — зарезервированы (в документации ProgrammerManual). --- ## 3.14 Кросс-ссылки - Загрузка EXE и модель памяти: `04-memory.md` - Файловые операции и `FILE*`: проектный `file-buffering-design.md` - API libc: проектный `libc-reference.md` - Порты дисков и IDE: `11-ports.md` - Баги DSS: `12-bugs.md` - BIOS (окна, графика): `02-bios.md`