mirror of
https://github.com/Tolik-Trek/Shared_Includes.git
synced 2026-06-15 00:51:32 +03:00
772 lines
47 KiB
NASM
772 lines
47 KiB
NASM
;███████████████████████████████████████████████████████████████████████████████████████████████████████
|
||
; Системные вызовы 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). |