Shared_Includes/Docs/DSS_1.71_Functions.asm

772 lines
47 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;███████████████████████████████████████████████████████████████████████████████████████████████████████
; Системные вызовы DSS (Disk SubSystem) v1.71
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; Вызов функций DSS выполняется командой RST 10h. Номер функции загружается
; в регистр C,параметры — в остальные регистры согласно описанию.
; Для удобства определена константа:
; ToDSS = #10
;
; Соглашение о флагах:
; CF = 0 (NC) — успешное завершение, в регистрах возвращается результат
; CF = 1 — ошибка, в регистре A код ошибки (см. таблицу ошибок DSS)
; Многие функции могут портить альтернативные регистры и IX,IY, если
; не оговорено иное. Стек должен находиться в безопасной области.
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 1. Функции идентификации системы
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_Version: ; Версия DSS
LD C,Dss.Version ; #00
RST ToDSS ; D - номер версии
; E - модификация
; BC - номер сборки
; HL = 0
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 2. Функции для работы с диском
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_ChDisk: ; Смена текущего диска
LD A,disk_num ; номер диска (0-A:, 1-B:, ...)
LD C,Dss.ChDisk ; #01
RST ToDSS ; CF=0: A - номер последнего диска в системе
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_CurDisk: ; Номер текущего диска
LD C,Dss.CurDisk ; #02
RST ToDSS ; CF=0: A - текущий номер диска,
; C - максимальный номер диска
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_DskInfo: ; Информация о диске
LD A,disk_num ; номер диска (0-A:, 1-B:, ..., #FF - текущий)
; A bit7=1 (A != #FF) - расширенный запрос:
; номер диска = A and #7F
; HL - буфер для расширенных данных, формат
; (длина поля, затем данные):
; 5 - тип ФС "FAT12"/"FAT16"/"FAT32"
; 4 - серийный номер тома
; 11 - метка тома
; 2 - физ. номер диска, номер раздела
; 0 - конец данных
; B != 0 - пересчитать свободные кластеры,
; B = 0 - вернуть кэшированное значение
; B учитывается только при A bit7=1
LD C,Dss.DskInfo ; #03
RST ToDSS ; CF=0: A - размер кластера в секторах
; HL':HL - общее количество кластеров
; DE':DE - количество свободных кластеров
; BC - размер сектора в байтах
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_G_Entry: ; Зарезервированная функция
LD C,Dss.G_ENTRY ; #04
RST ToDSS ; не используется
;-------------------------------------------------------------------------------------------------------
DSS_RescanDrives: ; Пересканировать диски и вернуть последний логический
LD C,Dss.RescanDrives ; #08
RST ToDSS ; A - номер последнего логического диска
;-------------------------------------------------------------------------------------------------------
DSS_BootDSK: ; Номер системного диска (подфункции в B)
; --- Получить системный диск ---
LD BC,Dss.BootDSK.Get ; B=0, C=#09
RST ToDSS ; CF=0: A - номер системного диска (0-A:, ...)
; CF=1: A - код ошибки
; --- Установить системный диск ---
; (служебная: используется boot-загрузчиком;
; после первого успешного вызова недоступна)
LD BC,Dss.BootDSK.Set ; B=1, C=#09
LD H,device_num ; номер устройства
LD L,partition ; номер раздела на устройстве
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 3. Функции для работы с файлами
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_Create: ; Создание файла (если существует, перезаписывается)
LD HL,filespec ; указатель на файловую спецификацию (строка с 0)
LD A,file_attr ; атрибут файла (биты DIR и VOLUME_ID снимаются)
LD C,Dss.Create ; #0A
RST ToDSS ; CF=0: A - файловый манипулятор
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Creat_N: ; Создание нового файла (если существует, ошибка)
LD HL,filespec ; указатель на файловую спецификацию
LD A,file_attr ; атрибут файла (биты DIR и VOLUME_ID снимаются)
LD C,Dss.Creat_N ; #0B
RST ToDSS ; CF=0: A - файловый манипулятор
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Delete: ; Удаление файла
LD HL,filespec ; указатель на файловую спецификацию
LD C,Dss.Delete ; #0E
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Rename: ; Переименование файла
LD HL,old_filespec ; указатель на старое имя
LD DE,new_filespec ; указатель на новое имя
LD C,Dss.Rename ; #10
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Open: ; Открытие файла
LD HL,filespec ; указатель на файловую спецификацию
LD A,open_mode ; режим доступа: 0 = чтение/запись,
; 1 = чтение,
; 2 = запись
LD C,Dss.Open ; #11
RST ToDSS ; CF=0: A - файловый манипулятор
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Close: ; Закрытие файла (ACCESS_DENIED, если манипулятор чужой задачи)
LD A,file_handle ; файловый манипулятор
LD C,Dss.Close ; #12
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Read: ; Чтение из файла
LD A,file_handle ; файловый манипулятор
LD HL,buffer ; адрес буфера в памяти
LD DE,bytes_to_read ; количество читаемых байт
LD C,Dss.Read ; #13
RST ToDSS ; CF=0: A - код завершения:
; A=0 - прочитаны все запрошенные байты
; A=#FF - прочитано меньше (или конец файла)
; DE - реальное количество прочитанных байт
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Write: ; Запись в файл
LD A,file_handle ; файловый манипулятор
LD HL,buffer ; адрес данных в памяти
LD DE,bytes_to_write ; количество записываемых байт
LD C,Dss.Write ; #14
RST ToDSS ; DE - реальное количество записанных байт
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Move_FP: ; Перемещение указателя в файле
LD A,file_handle ; файловый манипулятор
LD HL,offs_high ; смещение (старшая часть, биты 16-31)
LD IX,offs_low ; смещение (младшая часть, биты 0-15)
; (полное смещение = HL:IX, HL - старшая)
LD B,move_method ; способ перемещения:
; B=0 - от начала файла
; B=1 - от текущей позиции
; B=2 - от конца файла
LD C,Dss.Move_FP ; #15
RST ToDSS ; CF=0: HL:IX - новое значение (HL старш., IX младш.)
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Attrib: ; Получение/изменение атрибутов файла (B>=2 - ошибка INVALID_FUNCTION)
; -- Получить атрибут --;
LD BC,Dss.Attrib.Get ; B=0, C=#16
LD HL,filespec ; указатель на файловую спецификацию
RST ToDSS ; CF=0: A - атрибут файла
; CF=1: A - код ошибки
; - Установить атрибут -;
LD BC,Dss.Attrib.Set ; B=1, C=#16
LD HL,filespec ; указатель на файловую спецификацию
LD A,new_attr ; новый атрибут (бит VOLUME_ID снимается)
RST ToDSS ; CF=0: A - установленный атрибут
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Get_D_T: ; Получение даты и времени файла
LD A,file_handle ; файловый манипулятор
LD C,Dss.Get_D_T ; #17
RST ToDSS ; CF=0: D - день
; E - месяц
; IX - год
; H - час
; L - минуты
; B - секунды
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Put_D_T: ; Установка даты и времени файла
LD A,file_handle ; файловый манипулятор
LD D,day ; день
LD E,month ; месяц
LD IX,year ; год
LD H,hour ; час
LD L,minute ; минуты
LD B,second ; секунды
LD C,Dss.Put_D_T ; #18
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_F_First: ; Поиск первого совпадающего файла
LD A,search_attr ; атрибуты, используемые при поиске
LD HL,filespec ; указатель на файловую спецификацию
LD DE,buffer ; буфер: 44 байта (B=0, FAT-имя) или 46 байт (B=1, DOS-имя)
LD B,name_format ; формат имени:
; B=0 - 11 байт "FILENAMEEXT"
; B=1 - DOS-строка "filename.ext",0
; флаг поиска всех файлов (#80/#81)
; в v1.71 НЕ реализован (!TODO):
; LD BC,Dss.F_First.All_DOSname ; B=1 + старший бит = #81, C=#19
LD C,Dss.F_First ; #19
RST ToDSS ; CF=0: буфер DE заполнен информацией о файле
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_F_Next: ; Поиск следующего совпадающего файла
LD DE,buffer ; указатель на рабочий буфер, заполненный F_First
LD C,Dss.F_Next ; #1A
RST ToDSS ; CF=0: буфер обновлён
; CF=1: A - код ошибки (в т.ч. файлов больше нет)
;-------------------------------------------------------------------------------------------------------
DSS_MkDir: ; Создание каталога
LD HL,filespec ; указатель на спецификацию каталога
LD C,Dss.MkDir ; #1B
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_RmDir: ; Удаление каталога
LD HL,filespec ; указатель на удаляемый каталог
LD C,Dss.RmDir ; #1C
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_ChDir: ; Смена текущего каталога
LD HL,filespec ; указатель на новый каталог
LD C,Dss.ChDir ; #1D
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_CurDir: ; Получение текущего каталога (CF=1: TOO_DEEP_DIR_DEPTH)
LD HL,buffer ; буфер для строки пути (размер DIRECTORY_PATH_LENGTH)
LD C,Dss.CurDir ; #1E
RST ToDSS ; CF=0: буфер заполнен строкой пути
; CF=1: A - код ошибки
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 4. Функции для работы с датой и временем
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_SysTime: ; Текущая дата и время
LD C,Dss.SysTime ; #21
RST ToDSS ; D - день
; E - месяц
; IX - год
; H - час
; L - минуты
; B - секунды
; C - день недели
;-------------------------------------------------------------------------------------------------------
DSS_SetTime: ; Установить текущую дату и время
LD D,day ; день
LD E,month ; месяц
LD IX,year ; год
LD H,hour ; час
LD L,minute ; минуты
LD B,second ; секунды
LD C,Dss.SetTime ; #22
RST ToDSS ; всегда CF=0 (ошибок нет);
; день недели вычисляется автоматически
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 5. Функции управления памятью
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_SetWin: ; Подключение страницы памяти в заданное окно
LD A,mem_blk_id ; идентификатор блока памяти
LD B,page_num ; номер страницы в блоке (0,1,2...)
LD H,win_slot ; биты 7-6: номер окна (0-3)
; 00 - окно 0 (PAGE0)
; 01 - окно 1 (PAGE1)
; 10 - окно 2 (PAGE2)
; 11 - окно 3 (PAGE3)
LD C,Dss.SetWin ; #38
RST ToDSS ; CF=0: A - номер страницы, замещённой в окне
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_SetWin1: ; Подключение страницы памяти в первое окно (PAGE1)
LD A,mem_blk_id ; идентификатор блока
LD B,page_num ; номер страницы
LD C,Dss.SetWin1 ; #39
RST ToDSS ; CF=0: A - замещённая страница
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_SetWin2: ; Подключение страницы памяти во второе окно (PAGE2)
LD A,mem_blk_id ; идентификатор блока
LD B,page_num ; номер страницы
LD C,Dss.SetWin2 ; #3A
RST ToDSS ; CF=0: A - замещённая страница
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_SetWin3: ; Подключение страницы памяти в третье окно (PAGE3)
LD A,mem_blk_id ; идентификатор блока
LD B,page_num ; номер страницы
LD C,Dss.SetWin3 ; #3B
RST ToDSS ; CF=0: A - замещённая страница
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_InfoMem: ; Информация о памяти
LD C,Dss.InfoMem ; #3C
RST ToDSS ; HL - общее количество страниц (по 16 Кбайт)
; BC - количество свободных страниц
;-------------------------------------------------------------------------------------------------------
DSS_GetMem: ; Выделение блока памяти (закрепляется за задачей)
LD B,num_pages ; размер блока в страницах (16 Кбайт каждая)
LD C,Dss.GetMem ; #3D
RST ToDSS ; CF=0: A - идентификатор блока памяти
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_FreeMem: ; Освобождение блока памяти (только свой, иначе INVALID_MEMORY_HND)
LD A,mem_blk_id ; идентификатор блока
LD C,Dss.FreeMem ; #3E
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_SetMem: ; Изменение размера блока памяти (только свой блок)
LD A,mem_blk_id ; идентификатор блока
LD B,new_size ; новый размер в страницах
LD C,Dss.SetMem ; #3F
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 6. Функции ввода с клавиатуры
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_WaitKey: ; Ожидание символа с клавиатуры
LD C,Dss.WaitKey ; #30
RST ToDSS ; A - код символа (ASCII/внутренний)
; D - позиционный код (скан-код)
; E - ASCII-код
; C - режим клавиатуры:
; bit7: RUS/LAT
; bit6: Pause Lock
; bit3: Num Lock
; bit2: Scroll Lock
; bit1: Insert
; bit0: Caps Lock
; B - состояние клавиш-модификаторов:
; bit7: Left Shift
; bit6: Right Shift
; bit5: Ctrl
; bit4: Alt
; bit3: Left Ctrl
; bit2: Left Alt
; bit1: Right Ctrl
; bit0: Right Alt
;-------------------------------------------------------------------------------------------------------
DSS_ScanKey: ; Опрос клавиатуры без ожидания
LD C,Dss.ScanKey ; #31
RST ToDSS ; ZF=1: нет нажатых клавиш
; ZF=0: A,D,E,C,B как у WaitKey
;-------------------------------------------------------------------------------------------------------
DSS_EchoKey: ; Ожидание символа с печатью без скролла
LD C,Dss.EchoKey ; #32
RST ToDSS ; работа аналогична WaitKey, символ отображается
;-------------------------------------------------------------------------------------------------------
DSS_CTRLKey: ; Получить состояние клавиатуры (без символа)
LD C,Dss.CTRLKey ; #33
RST ToDSS ; A = 0 - нет символов в буфере
; A = #FF - в буфере есть символы
; C,B - состояние клавиатуры (как у WaitKey)
;-------------------------------------------------------------------------------------------------------
DSS_K_CLEAR: ; Очистить буфер клавиатуры и выполнить функцию
LD B,fn_number ; номер функции: #30 (WaitKey), #31 (ScanKey),
; #32 (EchoKey), #33 (CTRLKey)
; #34 (EDIT) - не реализовано в v1.71
LD C,Dss.K_CLEAR ; #35
RST ToDSS ; выходные значения как у вызванной функции
; B вне #30..#34 -> CF=1, A=1 (INVALID_FUNCTION)
;-------------------------------------------------------------------------------------------------------
DSS_K_SETUP: ; Управление настройками клавиатуры
; --- Чтение/запись таблицы раскладки клавиатуры ---
LD BC,Dss.K_SETUP.SetLayout ; B=0, C=#36
LD HL,keymap_buf ; буфер таблицы раскладки
LD A,layout_sel ; bit7=0 - запись (Set), bit7=1 - чтение (Get)
; биты0-2 - номер подтаблицы 0-7:
; 0=NormLat 1=ShiftLat 2=CapsLat 3=Shift2Lat
; 4=NormRus 5=ShiftRus 6=CapsRus 7=Shift2Rus
RST ToDSS ; CF=1, A=#13 (INVALID_ACCESS) при B>=5
; --- Получить звуковые переменные ---
LD BC,Dss.K_SETUP.GetSoundVars ; B=1, C=#36
RST ToDSS ; A - значение переменных
; --- Установить звуковые переменные ---
LD BC,Dss.K_SETUP.SetSoundVars ; B=2, C=#36
LD A,sound_flags ; биты: 0 - сигнал переполнения буфера
; 1 - сигнал переключения раскладки
RST ToDSS
; --- Включить отображение курсора ---
LD BC,Dss.K_SETUP.ShowCursor ; B=3, C=#36
RST ToDSS
; --- Выключить отображение курсора ---
LD BC,Dss.K_SETUP.HideCursor ; B=4, C=#36
RST ToDSS
;-------------------------------------------------------------------------------------------------------
DSS_TestKey: ; Опрос буфера клавиатуры (без извлечения символа)
LD C,Dss.TestKey ; #37
RST ToDSS ; ZF=1: буфер пуст
; ZF=0: A,D,E,C,B как у WaitKey
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 7. Функции для исполнения программ
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_Exec: ; Загрузить и выполнить файл
LD HL,filespec ; указатель на файловую спецификацию
LD B,search_mode ; 0 - с поиском в PATH (только если в
; спецификации нет '\')
; 1 - без поиска в PATH
LD C,Dss.Exec ; #40
RST ToDSS ; CF=0: A - код завершения программы
; CF=1: A - код ошибки (а также при
; аварийном завершении дочерней программы)
;-------------------------------------------------------------------------------------------------------
DSS_Exit: ; Завершение текущей программы
LD B,exit_code ; код завершения
LD C,Dss.Exit ; #41
RST ToDSS ; (возврата обычно не происходит)
;-------------------------------------------------------------------------------------------------------
DSS_Get_Err: ; Получить код завершения предыдущей программы
LD C,Dss.Get_Err ; #42
RST ToDSS ; A - код завершения
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 8. Функции для работы со строками и командной строкой
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_GSwitch: ; Выделить параметр из командной строки
LD HL,cmd_line ; указатель на командную строку
LD DE,param_buf ; буфер для выделяемого параметра
LD C,Dss.GSwitch ; #43
RST ToDSS ; HL - указатель на следующий параметр
; CF=0: ещё есть параметры
; CF=1: достигнут конец строки
;-------------------------------------------------------------------------------------------------------
DSS_DosName: ; Преобразование имени файла (11 символов / DOS-формат)
; --- 11-символьное имя -> DOS "name.ext",0 ---
LD BC,#00*256 + Dss.DosName ; B=0, C=#44
LD HL,name_11 ; указатель на 11-символьное имя
LD DE,dos_buf ; буфер для DOS-имени
RST ToDSS ; B=0: всегда успех (ошибок нет)
; --- DOS-имя -> 11-символьное ---
LD BC,#01*256 + Dss.DosName ; B=1, C=#44
LD HL,dos_name ; указатель на DOS-строку
LD DE,name_11 ; буфер для 11-символьного имени
RST ToDSS ; CF=0: успешно, CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_EX_Path: ; Расширенный разбор командной строки (подфункции)
; --- Разобрать строку на компоненты ---
LD BC,Dss.EX_Path.GET_ALL ; B=0, C=#45
LD HL,cmd_line ; указатель на командную строку
RST ToDSS ; CF=0: A - результат разбора (биты):
; bit7: найдены шаблоны ? или *
; bit3: указано имя диска
; bit2: указан путь
; bit1: указано расширение
; bit0: указано имя файла
; --- Выделить имя диска ---
LD BC,Dss.EX_Path.GET_DRIVE ; B=1, C=#45
LD HL,cmd_line
LD DE,drive_buf ; буфер (13 байт)
RST ToDSS ; CF=0: A - номер диска (0-...), буфер - "A:",0
; --- Выделить директорию ---
LD BC,Dss.EX_Path.GET_PATH ; B=2, C=#45
LD HL,cmd_line
LD DE,dir_buf ; буфер (256 байт)
RST ToDSS ; CF=0: A - результат разбора, буфер - путь
; --- Выделить имя файла ---
LD BC,Dss.EX_Path.GET_NAME ; B=3, C=#45
LD HL,cmd_line
LD DE,name_buf ; буфер (13 байт)
RST ToDSS ; CF=0: A - результат, буфер - "FILE.EXT",0
; --- Выделить расширение ---
LD BC,Dss.EX_Path.GET_TYPE ; B=4, C=#45
LD HL,cmd_line
LD DE,ext_buf ; буфер (4 байта)
RST ToDSS ; CF=0: A - результат, буфер - "EXT",0
; --- Выделить все компоненты вместе ---
LD BC,Dss.EX_Path.GET_ALL_EX ; B=5, C=#45
LD HL,cmd_line
LD DE,components_table ; адрес таблицы из 8 байт:
; +0: адрес буфера для диска (2 байта)
; +2: адрес буфера для директории (2 байта)
; +4: адрес буфера для имени файла (2 байта)
; +6: адрес буфера для расширения (2 байта)
RST ToDSS ; CF=0: A - результат, буферы заполнены
; --- B=6: зарезервировано (возвращает INVALID_FUNCTION) ---
; --- Выделить параметр командной строки (= функция #43) ---
LD BC,Dss.EX_Path.GSWITCH ; B=7, C=#45
LD HL,cmd_line ; указатель на командную строку
LD DE,param_buf ; буфер для параметра
RST ToDSS ; HL - на следующий параметр;
; CF=0: ещё есть параметры; CF=1: конец строки
; --- Преобразовать 11-символьное имя -> DOS ---
LD BC,Dss.EX_Path.GETNAME ; B=8, C=#45
LD HL,name_11
LD DE,dos_buf
RST ToDSS
; --- Преобразовать DOS -> 11-символьное имя ---
LD BC,Dss.EX_Path.MASK ; B=9, C=#45
LD HL,dos_name
LD DE,name_11
RST ToDSS
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 9. Функции для работы с переменными
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_Environ: ; Работа с системным окружением
; --- Инициализация окружения (служебная!) ---
; ВНИМАНИЕ: сбрасывает всё окружение к умолчанию (только BOOTDSK=)
LD BC,Dss.Environ.Init ; B=255, C=#46
RST ToDSS ; CF=0: успешно
; --- Получить всё окружение ---
LD BC,Dss.Environ.Read ; B=0, C=#46
LD HL,buffer ; буфер для строк окружения
RST ToDSS ; CF=0: A=0 - успех
; --- Получить значение переменной ---
LD BC,Dss.Environ.Get ; B=1, C=#46
LD HL,var_name ; указатель на имя переменной
LD DE,value_buf ; буфер для значения
RST ToDSS ; CF=0: A=#FF - найдена, A=0 - не найдена
; --- Установить/удалить переменную ---
LD BC,Dss.Environ.Set ; B=2, C=#46
LD HL,var_string ; указатель на строку "ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ"
RST ToDSS ; CF=0: успех
;-------------------------------------------------------------------------------------------------------
DSS_AppInfo: ; Информация о текущем приложении (B>=3 - INVALID_FUNCTION)
; --- Параметры командной строки ---
LD BC,Dss.AppInfo.CMD_Param ; B=0, C=#47
LD HL,buffer ; буфер для параметров
RST ToDSS ; CF=0: успех, CF=1: ошибка
; --- Полный путь к каталогу программы ---
LD BC,Dss.AppInfo.EXE_HomeDir ; B=1, C=#47
LD HL,buffer ; буфер для пути
RST ToDSS ; CF=1: A=COMMON_ERROR при ошибке разбора
; --- Полный путь и имя файла программы ---
LD BC,Dss.AppInfo.EXE_FullPath ; B=2, C=#47
LD HL,buffer
RST ToDSS
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 10. Функции работы с экраном
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_SetVMod: ; Выбор видеорежима
LD A,video_mode ; режим: 02h - текст 40x32 (16 цветов)
; 03h - текст 80x32 (16 цветов)
; 81h - графика 320x256x256
; 82h - графика 640x256x16
; (00h,01h,80h,83h не реализованы -> ошибка)
LD B,screen_page ; номер страницы экрана, которая будет активна (0/1)
LD C,Dss.SetVMod ; #50
RST ToDSS ; CF=0: успех, CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_GetVMod: ; Получить текущий видеорежим
LD C,Dss.GetVMod ; #51
RST ToDSS ; CF=0: A - текущий режим, B - активная страница (0/1)
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Locate: ; Установить позицию курсора в текущем окне
LD D,row ; строка (вертикаль)
LD E,column ; столбец (горизонталь)
LD C,Dss.Locate ; #52
RST ToDSS ; (без возврата значений)
;-------------------------------------------------------------------------------------------------------
DSS_Cursor: ; Получить позицию курсора
LD C,Dss.Cursor ; #53
RST ToDSS ; D - строка, E - столбец
;-------------------------------------------------------------------------------------------------------
DSS_SelPage: ; Выбрать активную страницу экрана
LD B,screen_page ; 0 или 1
LD C,Dss.SelPage ; #54
RST ToDSS ; CF=0: успех, CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Scroll: ; Прокрутка окна
LD D,row ; строка левого верхнего угла
LD E,column ; столбец левого верхнего угла
LD H,height ; высота окна в строках
LD L,width ; ширина окна в символах
LD B,direction ; 1 = вверх, 2 = вниз
; (иное -> CF=1, A=INVALID_FUNCTION)
LD A,clear_mode ; 0 = очищать строку пробелами,
; иначе - не очищать
LD C,Dss.Scroll ; #55
RST ToDSS ; CF=1, A=код ошибки при B вне {1,2}
;-------------------------------------------------------------------------------------------------------
DSS_Clear: ; Очистка прямоугольной области экрана
LD D,row ; строка левого верхнего угла
LD E,column ; столбец левого верхнего угла
LD H,height ; высота
LD L,width ; ширина
LD B,attr ; атрибут заполнения
LD A,char ; символ заполнения
LD C,Dss.Clear ; #56
RST ToDSS
;-------------------------------------------------------------------------------------------------------
DSS_RdChar: ; Прочитать символ и атрибут с экрана
LD D,row ; строка
LD E,column ; столбец
LD C,Dss.RdChar ; #57
RST ToDSS ; A - символ, B - атрибут
;-------------------------------------------------------------------------------------------------------
DSS_WrChar: ; Записать символ и атрибут в указанную позицию экрана
LD D,row ; строка
LD E,column ; столбец
LD A,char ; символ
LD B,attr ; атрибут
LD C,Dss.WrChar ; #58
RST ToDSS
;-------------------------------------------------------------------------------------------------------
DSS_WinCopy: ; Запомнить содержимое окна в буфер
LD D,row ; строка начала
LD E,column ; столбец начала
LD H,height ; высота
LD L,width ; ширина
LD B,buf_page ; страница буфера (если IX > #C000)
LD IX,buffer ; адрес буфера в памяти
LD C,Dss.WinCopy ; #59
RST ToDSS
;-------------------------------------------------------------------------------------------------------
DSS_WinRest: ; Восстановить окно из буфера
LD D,row ; строка начала
LD E,column ; столбец начала
LD H,height ; высота
LD L,width ; ширина
LD B,buf_page ; страница буфера (если IX > #C000)
LD IX,buffer ; адрес буфера в памяти
LD C,Dss.WinRest ; #5A
RST ToDSS
;-------------------------------------------------------------------------------------------------------
DSS_PutChar: ; Печать символа в текущей позиции курсора
LD A,char ; символ
LD C,Dss.PutChar ; #5B
RST ToDSS
;-------------------------------------------------------------------------------------------------------
DSS_PChars: ; Печать строки в текущей позиции курсора
LD HL,string ; указатель на строку (заканчивается 0)
LD C,Dss.PChars ; #5C
RST ToDSS ; строка печатается до байта 0 (HL после вызова не определён)
;-------------------------------------------------------------------------------------------------------;!FIXIT
DSS_Lib_Sub: ; Библиотечные подфункции
; --- Восстановить системный шрифт ---
LD BC,Dss.Lib_Sub.RestoreFont ; B=1, C=#5D
RST ToDSS ; восстанавливает знакогенератор по умолчанию
; (B != 1 -> CF=1, A не изменяется)
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 11. Функции для печати на принтере
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_Print: ; Вывод символа на принтер без ожидания
LD A,char ; символ для печати
LD C,Dss.Print ; #5F
RST ToDSS ; CF=0: символ отправлен в порт принтера
; CF=1: A - байт состояния принтера, B - символ не выведен
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 12. Коды ошибок DSS (регистр A при CF=1)
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; #00 - нет ошибки / неизвестная ошибка
; #01 - неверный номер функции
; #02 - неверный номер диска/устройства
; #03 - файл не найден
; #04 - путь не найден
; #05 - неверный файловый манипулятор
; #06 - нет свободных файловых манипуляторов (слишком много открытых файлов)
; #07 - файл уже существует
; #08 - файл только для чтения
; #09 - переполнение корневого каталога (ROOT)
; #0A - нет свободного места на диске
; #0B - каталог не пуст
; #0C - попытка удалить текущий каталог
; #0D - неизвестный формат / неверный носитель
; #0E - недопустимая операция/доступ
; #0F - каталог уже существует
; #10 - неверное имя
; #11 - неверный EXE-файл
; #12 - неподдерживаемый формат EXE-файла
; #13 - доступ запрещён (ACCESS_DENIED)
; #14 - устройство не готово
; #15 - ошибка позиционирования
; #16 - сектор не найден
; #17 - ошибка CRC
; #18 - диск защищён от записи
; #19 - ошибка чтения
; #1A - ошибка записи
; #1B - сбой диска
; #1C - носитель сменён
; #1D - устройство занято / нет носителя
; #1E - недостаточно памяти
; #1F - неверный идентификатор блока памяти
; #20 - операция не поддерживается
; #21 - превышен максимальный размер переменной окружения
; #22 - (зарезервировано)
; #23 - слишком много файлов в каталоге
; #24 - слишком глубокая вложенность каталогов или число папок > 1023
; #25 - операция прервана пользователем
; #26 - общая ошибка
; #27 - неожиданное завершение приложения
; #30 - неверный видеорежим
; #28..#2F, #31..#7F - зарезервировано
; Ошибки драйверов имеют установленный бит #80 (маска DRV_MASK),
; ошибки ATAPI - дополнительную маску. Полный список см.
; в Shared_Includes/constants/dss_equ.inc (модуль DSS_Error).