Shared_Includes/Docs/DSS_1.71_Functions.asm
Tolik Trek d2ba40c462 docs
2026-05-15 06:18:47 +10:00

685 lines
40 KiB
NASM
Raw 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 - номер сборки
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 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:
; HL - буфер 256 байт для расширенных данных
; (формат: длина поля, данные, ...)
; B = 0 - не подсчитывать свободные кластеры
LD C,Dss.DskInfo ; #03
RST ToDSS ; CF=0: A - размер кластера в секторах
; HL':HL - общее количество кластеров
; DE':DE - количество свободных кластеров
; BC - размер сектора в байтах
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_G_Entry: ; Зарезервированная функция
LD C,#04 ; #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 - код ошибки
; --- Установить системный диск ---
LD BC,Dss.BootDSK.Set ; B=1, C=#09
LD A,disk_num ; номер системного диска
RST ToDSS ; CF=0: успешно
; CF=1: A - код ошибки
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 3. Функции для работы с файлами
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_Create: ; Создание файла (если существует, перезаписывается)
LD HL,filespec ; указатель на файловую спецификацию (строка с 0)
LD A,file_attr ; атрибут файла
LD C,Dss.Create ; #0A
RST ToDSS ; CF=0: A - файловый манипулятор
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Creat_N: ; Создание нового файла (если существует, ошибка)
LD HL,filespec ; указатель на файловую спецификацию
LD A,file_attr ; атрибут файла
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: ; Закрытие файла
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_low ; смещение (младшая часть)
LD IX,offs_high ; смещение (старшая часть)
; (полное смещение = HL:IX)
LD B,move_method ; способ перемещения:
; B=0 - от начала файла
; B=1 - от текущей позиции
; B=2 - от конца файла
LD C,Dss.Move_FP ; #15
RST ToDSS ; CF=0: HL:IX - новое значение указателя
; CF=1: A - код ошибки
;-------------------------------------------------------------------------------------------------------
DSS_Attrib: ; Получение/изменение атрибутов файла
; -- Получить атрибут --;
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 ; новый атрибут
RST ToDSS ; CF=0: успешно
; 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 или 46 байт в зависимости от B)
LD B,name_format ; формат имени:
; B=0 - 11 байт "FILENAMEEXT"
; B=1 - DOS-строка "filename.ext",0
; или с флагом поиска всех файлов:
; 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: ; Получение текущего каталога
LD HL,buffer ; буфер размером 256 байт
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: успешно
; CF=1: A - код ошибки
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 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: ; Освобождение блока памяти
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
; 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 - нет символов в буфере
; C,B - состояние клавиатуры (как у WaitKey)
;-------------------------------------------------------------------------------------------------------
DSS_K_CLEAR: ; Очистить буфер клавиатуры и выполнить функцию
LD B,fn_number ; номер функции: #30 (WaitKey), #31 (ScanKey),
; #32 (EchoKey), #33 (CTRLKey) или #34 (EDIT)
LD C,Dss.K_CLEAR ; #35
RST ToDSS ; выходные значения как у вызванной функции
;-------------------------------------------------------------------------------------------------------
DSS_K_SETUP: ; Управление настройками клавиатуры
; --- Установить раскладку ---
LD BC,Dss.K_SETUP.SetLayout ; B=0, C=#36
LD A,layout_num ; номер раскладки (0-7)
RST ToDSS
; --- Получить звуковые переменные ---
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 ; CF=0: успешно, CF=1: A - код ошибки
; --- 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 байт:
; DE+0: адрес буфера для диска
; DE+2: адрес буфера для директории
; DE+3: адрес буфера для имени файла
; DE+4: адрес буфера для расширения
RST ToDSS ; CF=0: A - результат, буферы заполнены
; --- Преобразовать 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: ; Работа с системным окружением
; --- Получить всё окружение ---
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=0 - найдена, A=#FF - не найдена
; --- Установить/удалить переменную ---
LD BC,Dss.Environ.Set ; B=2, C=#46
LD HL,var_string ; указатель на строку "ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ"
RST ToDSS ; CF=0: успех
;-------------------------------------------------------------------------------------------------------
DSS_AppInfo: ; Информация о текущем приложении
; --- Параметры командной строки ---
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
; --- Полный путь и имя файла программы ---
LD BC,Dss.AppInfo.EXE_FullPath ; B=2, C=#47
LD HL,buffer
RST ToDSS
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 10. Функции работы с экраном
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_SetVMod: ; Выбор видеорежима
LD A,video_mode ; режим: 02h - текст 40x32
; 03h - текст 80x32
; 81h - графика 320x256
; 82h - графика 640x256
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 = вниз
LD A,clear_mode ; 0 = очищать освободившуюся строку пробелами
LD C,Dss.Scroll ; #55
RST ToDSS
;-------------------------------------------------------------------------------------------------------
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 ; HL - указатель на байт за концом строки
;-------------------------------------------------------------------------------------------------------;!FIXIT
DSS_Lib_Sub: ; Библиотечные подфункции
; --- Восстановить системный шрифт ---
LD BC,Dss.Lib_Sub.RestoreFont ; B=1, C=#5D
RST ToDSS ; восстанавливает знакогенератор по умолчанию
;███████████████████████████████████████████████████████████████████████████████████████████████████████
; 11. Функции для печати на принтере
;███████████████████████████████████████████████████████████████████████████████████████████████████████
;-------------------------------------------------------------------------------------------------------
DSS_Print: ; Вывод символа на принтер без ожидания
LD A,char ; символ для печати
LD C,Dss.Print ; #5F
RST ToDSS ; CF=0: символ отправлен в порт принтера
; CF=1: принтер не готов, B - символ не выведен