;███████████████████████████████████████████████████████████████████████████████████████████████████████ ; Системные вызовы 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).