Список процедур проекта сгенерированный ИИ. Метки, не начинающиеся с точки (и некоторые значимые локальные метки, используемые как точки входа), с описанием входов/выходов/портящихся регистров на основе анализа кода. Структура: ИмяПроцедуры Вход: список регистров/условий Выход: список регистров/флагов Портит: разрушаемые регистры (кроме явно указанных в Выходе) Файлы сгруппированы по принадлежности. ████████████████████████████████████████████████████████████████████ DSS-MAIN.ASM ████████████████████████████████████████████████████████████████████ RST_0x00 (стартовая точка RST 00): Вход: - Выход: - Портит: - Описание: безусловный переход на RETFAR (завершение задачи). RST_0x08 (API BIOS): Вход: - Выход: - Портит: AF Описание: переключает страницу на BIOS (SYS_PORT.BIOS) и возвращает управление; используется для вызова функций BIOS через RST 8. RST_0x10 (API DSS): Вход: C = номер функции DSS (0..5Fh) Выход: переход на соответствующую функцию из таблицы DSS_API_TABLE Портит: HL Описание: диспетчер функций DSS, вызывается командой RST 10h. RST_0x18 (API драйверов): Вход: C = номер функции драйвера (Dss.DRV.xxx) Выход: переход в PORTAL.out_MAIN для переключения страницы драйвера Портит: AF, BC Описание: диспетчер вызова драйверов накопителей через RST 18h. RST_0x20: Вход: - Выход: переход на RST_20 Портит: - Описание: диспетчер RST 20h. RST_0x28: Вход: - Выход: переход на RST_28 Портит: - Описание: диспетчер RST 28h. RST_0x30 (мышь): Вход: - Выход: переключение на страницу драйвера мыши (из RST_0x30.drv_page) и возврат Портит: AF Описание: диспетчер вызова функций мыши через RST 30h. RST_38_IM1 (обработчик INT 38h): Вход: - Выход: после обработки возврат в основную программу Портит: - Описание: основной обработчик прерываний IM 1 с сохранением всех регистров. PORTAL.out_MAIN: Вход: B = номер страницы драйвера, C = SLOT0 Выход: переключение слота 3 на страницу драйвера, восстановление BC, возврат Портит: A (при IN A,(C)) Описание: вход в страницу драйверов из DSS main. CLEAR_BUFFER_AND_INIT_PROC: Вход: - Выход: - Портит: AF, HL, DE, BC Описание: очищает системные буферы, инициализирует пути, FM_BUF, окружение, курсоры и переходит на VERSION. INTx38_Handler: Вход: - Выход: - Портит: все регистры сохраняются Описание: полный обработчик прерывания с вызовом KEYSCAN, опросом мыши и обновлением курсора. RST_10: Вход: C = номер функции DSS Выход: переход по адресу из DSS_API_TABLE Портит: HL Описание: реализация RST 10h с поддержкой укороченной таблицы (SHORT_RSTx10_TABLE). F_START: Вход: A = номер загрузочного устройства, H = номер раздела Выход: после инициализации переход на CLEAR_BUFFER_AND_INIT_PROC Портит: практически все Описание: первый старт системы, проверка версии BIOS, развёртывание драйверов, инициализация железа. DEPLOY: Вход: - Выход: CF=0 успех, CF=1 ошибка выделения памяти Портит: AF, BC, HL, DE, IX Описание: выделение страниц памяти, копирование кода драйвера в страницу DRVPAGE, настройка портов. CHECK_64kb_CLUSTER: Вход: (CORE_BUFFERS.FS_Buffer.BytesPerCluster) - размер кластера Выход: CF=0 если размер кластера <= 32K, CF=1 и A=WRITE_PROTECT если 64K Портит: HL, AF Описание: проверка на недопустимый 64-килобайтный кластер. ████████████████████████████████████████████████████████████████████ KEYINTER.ASM ████████████████████████████████████████████████████████████████████ WAITKEY: Вход: - Выход: A = ASCII-код нажатой клавиши (если A=0, то не ASCII) Портит: AF, HL Описание: ожидание нажатия клавиши, возвращает код при нажатии. SCANKEY: Вход: - Выход: Z=1 нет клавиши, Z=0 клавиша нажата (A=E=ASCII или 0) Портит: AF, HL Описание: опрос клавиатуры без ожидания. ECHOKEY: Вход: - Выход: A = ASCII-код нажатой клавиши, курсор во время ожидания мигает Портит: AF, DE, BC Описание: ожидание клавиши с отображением мигающего курсора. Cursor: Вход: (Cursor.Flag) - текущее состояние курсора Выход: переключает флаг и знакогенератор курсора Портит: AF, BC, DE, HL Описание: переключение видимости/формы курсора в текстовом режиме. Cursor_On: Вход: - Выход: включает курсор, запоминает позицию и символ под ним Портит: AF, BC, DE, HL Описание: включение курсора в текстовом режиме. Cursor_Off: Вход: (Cursor_Off.Flag) = 1 Выход: выключает курсор, восстанавливает исходный символ Портит: AF, BC, DE, HL Описание: выключение курсора. cursor_interrupt: Вход: (Cursor_Off.Flag), (cursor_interrupt.timer) Выход: - Портит: AF Описание: обработчик прерывания для анимации курсора. SETUP_CURSORS: Вход: - Выход: инициализирует знакогенераторы курсора ("черточка" и "блок") через BIOS Портит: AF, BC, DE, HL Описание: настройка графических образов курсора. CTRLKEY: Вход: - Выход: A=0 буфер клавиатуры пуст, A=FF есть нажатые клавиши; BC = (KEYFLAG) Портит: AF, BC, HL Описание: проверка наличия нажатых клавиш и возврат флагов модификаторов. TESTKEY: Вход: - Выход: A=E=ASCII-код последней клавиши, D=скан-код, BC=флаги, если буфер не пуст; иначе Z=1 Портит: AF, BC, DE, HL Описание: возвращает информацию о последней нажатой клавише без её удаления из буфера. K_CLEAR: Вход: A = номер подфункции (Dss.WaitKey..Dss.EDIT) Выход: выполняется соответствующая функция клавиатуры; при ошибке CF=1 и A=код ошибки Портит: AF Описание: диспетчер функций клавиатуры (K_CLEAR, K_SETUP). K_SETUP: Вход: B = номер подфункции (0..4), A = параметр Выход: зависит от подфункции (установка раскладок, звуковых флагов, управление курсором) Портит: различные Описание: расширенные настройки клавиатуры. PUTSYM: Вход: E=ASCII, D=скан-код, BC=флаги Выход: - Портит: AF, HL Описание: помещает событие клавиатуры в кольцевой буфер. GETSYM: Вход: - Выход: E=ASCII, D=скан-код, BC=флаги; Z=1 если буфер пуст Портит: AF, HL Описание: извлекает событие из клавиатурного буфера. GetSymAddr: Вход: (HL) = текущий хвост буфера Выход: HL = адрес записи в буфере, обновляет указатель Портит: AF Описание: вспомогательная, вычисляет адрес в буфере для записи. FULL_BF: Вход: буфер клавиатуры полон Выход: звуковой сигнал при SF_BUFF=1 Портит: AF, BC, DE, HL (EXX) Описание: обработка переполнения буфера клавиатуры. KEYSCAN: Вход: IX = KEYFLAG (база флагов) Выход: - Портит: AF, BC, DE, HL, IX Описание: основной сканер клавиатуры, вызывается из прерывания. BEEP: Вход: DE = частота, HL = продолжительность Выход: - Портит: AF, BC, DE, HL Описание: генерация звукового сигнала через бипер. KEYBOARD_INIT: Вход: - Выход: инициализирует Z84 SIO Ch.A для клавиатуры Портит: AF, BC Описание: программирование портов клавиатуры. KBD_Receiver_Overrun: Вход: - Выход: сброс ошибки переполнения приёмника SIO Портит: AF Описание: очистка ошибок последовательного порта клавиатуры. INPCODE: Вход: L = позиционный код, IX = KEYFLAG Выход: D = позиционный код, E = ASCII-символ (0 если нет) Портит: AF, BC, DE, HL Описание: преобразование скан-кода в ASCII с учётом раскладки и модификаторов. SHIFTS: Вход: L = позиционный код, IX = KEYFLAG Выход: обновляет флаги модификаторов (Shift, Ctrl, Alt) Портит: AF Описание: установка флагов при нажатии управляющих клавиш. UNSHIFT: Вход: L = позиционный код, IX = KEYFLAG Выход: сбрасывает флаги модификаторов Портит: AF Описание: снятие флагов при отпускании управляющих клавиш. XLAT: Вход: A = скан-код, IX = KEYFLAG Выход: L = позиционный код Портит: AF, HL Описание: преобразование скан-кода в позиционный код с учётом флагов E0 и т.д. RUSCODE: Вход: L = позиционный код, IX = KEYFLAG Выход: E = ASCII-символ русской раскладки Портит: AF, BC, DE, HL Описание: формирование ASCII для русских букв. CONVERT: Вход: HL = позиционный код, BC = адрес таблицы Выход: E = ASCII из таблицы Портит: HL, DE Описание: общая подпрограмма чтения таблицы раскладки. KEYMAP: Вход: A = номер таблицы (0..7) + флаг записи/чтения (бит 7), HL = адрес данных для чтения, BC = длина Выход: A=0 успех, CF=1 ошибка Портит: HL, DE, BC Описание: чтение/запись таблиц раскладки клавиатуры. ████████████████████████████████████████████████████████████████████ DOS_Proc.asm ████████████████████████████████████████████████████████████████████ GetName: Вход: HL = адрес 11-байтового имени "FILENAMEEXT", DE = буфер для "FILENAME.EXT",0 Выход: буфер заполнен, CF сброшен Портит: AF, BC, DE, HL Описание: преобразование FAT-имени 8.3 в строку с точкой. SetPath_GetName: Вход: HL = указатель на путь (строка) Выход: CF=0 успех, обновлены TMPNAME и, возможно, текущий диск/каталог; CF=1 ошибка Портит: AF, BC, DE, HL Описание: разбор строки пути, переключение дисков и каталогов, заполнение TMPNAME. OPENDSK: Вход: A = номер диска (0..25) Выход: CF=0 успех (диск открыт, LDRIVE не 0), CF=1 ошибка (A=код ошибки) Портит: AF, BC, DE, HL Описание: открытие логического диска, чтение BPB, обработка смены носителя. MASK: Вход: HL = шаблон имени (DOS-формат), DE = буфер 11 байт Выход: CF=0 успех, C=0 файл без расширения, C=1 с расширением; CF=1 ошибка A=INVALID_NAME Портит: AF, BC, DE, HL Описание: преобразование DOS-имени/шаблона в 11-байтовый формат FAT. CHECK_NAME: Вход: (MASKARE) = 11-байтовое имя Выход: CF=0 имя без '?', CF=1 есть '?' (ошибка) Портит: AF, BC, HL Описание: проверка 11-байтового имени на наличие символов '?'. FM_FIND: Вход: A = номер файлового манипулятора (0..FMCOUNT) Выход: ZF=1 ошибка (A=INVALID_HANDLE), ZF=0 IY указывает на структуру манипулятора Портит: AF, DE, IY Описание: поиск файлового манипулятора по номеру. SET_FM: Вход: C = номер манипулятора Выход: CF=0 манипулятор существует, CF=1 ошибка Портит: AF, DE, IY Описание: проверка существования манипулятора. RES_FM: Вход: C = номер манипулятора Выход: CF=0 успех, имя манипулятора обнулено; CF=1 ошибка Портит: AF, DE, IY Описание: освобождение (закрытие) файлового манипулятора. GET_FM: Вход: - Выход: CF=0 найден свободный манипулятор (IY указывает на него, C=номер), CF=1 нет свободных (A=NO_HANDLES) Портит: AF, BC, DE, IY Описание: поиск свободного файлового манипулятора. MOVE_CP: Вход: IY = файловый манипулятор Выход: CF=1 файловый указатель >= размер файла, CF=0 меньше Портит: HL, DE Описание: сравнение текущей позиции в файле с его размером. RD_BPB: Вход: - Выход: CF=0 успех (прочитан BPB в SECTOR_BUFFER), CF=1 ошибка (A=UNKNOWN_FORMAT) Портит: AF, BC, DE, HL Описание: чтение boot-сектора, проверка сигнатуры и передача управления FAT_BPB или CDFS. DIR_PATH_CHANGE (различные точки входа): .FullCurrent/.Current/.FullWork/.Work: Вход: зависит от точки Выход: обновляет CORE_BUFFERS.CurrentPath, CurrentDirectory, WorkDirectory Портит: AF, BC, DE, HL Описание: набор процедур для синхронизации текущего пути и каталога. DIR_PATH_CHECK: Вход: HL = указатель на проверяемый путь Выход: ZF=1 путь соответствует текущему, иначе переключение Портит: AF, BC, DE, HL Описание: проверка и установка текущего пути. ████████████████████████████████████████████████████████████████████ FAT.asm ████████████████████████████████████████████████████████████████████ SET_FSInfo: Вход: (FS_Buffer) заполнен Выход: записывает FSInfo сектор на диск, если FAT32 Портит: AF, BC, DE, HL Описание: обновление информации FSInfo (свободные кластеры и первый свободный). READ_BPB: Вход: - Выход: CF=0 BPB прочитан в SECTOR_BUFFER, CF=1 ошибка Портит: AF, BC, DE, HL Описание: чтение boot-сектора через драйвер. WRITE_SECTOR: Вход: HL:IX = номер сектора, (SECTOR_BUFFER) = данные Выход: CF=0 успех Портит: AF, BC, DE, HL Описание: запись одного сектора из SECTOR_BUFFER. READ_SECTOR: Вход: HL:IX = номер сектора Выход: CF=0 сектор в SECTOR_BUFFER Портит: AF, BC, DE, HL Описание: чтение одного сектора в SECTOR_BUFFER. RW_SECTOR: Вход: C = команда (Read/Write) Выход: CF=0 успех Портит: AF, BC, DE, HL Описание: универсальное чтение/запись сектора. DELETE_LFN_RECORDS: Вход: IX = запись каталога в DIRPAGE Выход: предыдущие LFN-записи помечаются как удалённые (#E5) Портит: AF, DE, IX Описание: удаление длинных имён (LFN) для заданной записи каталога. SEARCH: Вход: (MASKARE) = имя/шаблон, A = атрибут Выход: CF=0 найдено (DE=индекс в DIRPAGE, HANDBUF заполнен), CF=1 ошибка Портит: AF, BC, DE, HL, IX Описание: поиск записи в каталоге. FINDDIR: Вход: (MASKARE) = имя подкаталога Выход: CF=0 найден (IY:DE = первый кластер), CF=1 ошибка Портит: AF, BC, DE, HL, IX Описание: поиск подкаталога в текущем каталоге. CHECK_ROOT_CLUSTER: Вход: IY = файловый манипулятор (FM_BUF) Выход: ZF=1 первый кластер равен 0 (корень), ZF=0 иначе Портит: AF, HL Описание: проверка на корневой каталог. OPENDIR: Вход: HL = имя подкаталога Выход: CF=0 каталог открыт, обновлён FM_BUF[0]; CF=1 ошибка Портит: AF, BC, DE, HL, IY Описание: открытие подкаталога, включая "." и "..". LOADDIR: Вход: (FM_BUF[0]) содержит начальный кластер Выход: CF=0 каталог прочитан в DIRPAGE Портит: AF, BC, DE, HL, IY Описание: загрузка содержимого каталога в кэш DIRPAGE. LOAD_SAVE_DIR_PREPARE: Вход: IY = файловый манипулятор (0) Выход: подготавливает манипулятор и позицию для чтения/записи каталога Портит: AF, BC, DE, HL, IX Описание: настройка для операций с кэшем каталога. WRT_HND: Вход: (HANDBUF) = запись каталога Выход: CF=0 запись вставлена в DIRPAGE и сброшена на диск Портит: AF, BC, DE, HL, IY Описание: добавление или перезапись элемента каталога. SAVEDIR: Вход: (DIRPAGE) содержит изменённый каталог Выход: CF=0 данные записаны на диск Портит: AF, BC, DE, HL, IY Описание: сохранение кэша каталога на диск. FAT_BPB: Вход: (SECTOR_BUFFER) содержит BPB Выход: CF=0 успех (заполнены FS_Buffer и кэш FAT), CF=1 ошибка Портит: практически все Описание: анализ BPB, определение типа FAT, расчёт структур, загрузка первого блока FAT. G_CLUST: Вход: - Выход: HL':HL = номер свободного кластера (начиная с (G_CLUST.low/.high)+1), CF=1 диск полон Портит: AF, BC, DE, HL, EXX Описание: поиск первого свободного кластера в FAT. SET_NEW_FREE_CLUSTER: Вход: HL':HL = кластер Выход: обновляет (G_CLUST.low/.high) если номер меньше предыдущего, устанавливает флаг UPD_FSINFO Портит: AF, DE, HL Описание: запоминание найденного свободного кластера. SET_NEW_FREE_CLUSTERS: Вход: A = 0 уменьшить, !=0 увеличить; текущий FS_Buffer.FREE_CLUSTERS_COUNT Выход: обновляет счётчик свободных кластеров и флаг UPD_FSINFO Портит: AF, HL, DE Описание: изменение счётчика свободных кластеров. INC_FAT: Вход: HL':HL = номер кластера, к которому добавляется новый Выход: CF=0 успех (HL':HL = предыдущий кластер, DE':DE = новый), CF=1 диск полон Портит: AF, BC, DE, HL Описание: добавление нового кластера в цепочку файла. CHECK_CLUSTER_IS_SMALLER: Вход: HL':HL = номер кластера Выход: CF=0 кластер в допустимом диапазоне, CF=1 превышает MaxCluster (DISK_FULL) Портит: AF, DE, HL Описание: проверка номера кластера на выход за границы раздела. READ_FROM_FAT: Вход: HL':HL = номер кластера Выход: DE':DE = содержимое FAT для этого кластера, CF=1 конец цепочки (спец. значение) Портит: AF, BC, DE, HL Описание: чтение элемента FAT (с использованием кэша). WRITE_TO_FAT: Вход: HL':HL = номер кластера, DE':DE = значение (по умолчанию END_CHAIN_CLUSTER) Выход: значение записано в кэш FAT, CF=0 Портит: AF, DE, HL Описание: запись элемента FAT. GET_FAT32_CELL: Вход: HL':HL = номер кластера Выход: HL = адрес ячейки в кэше FATPAGE Портит: AF, BC, DE, HL Описание: вычисление адреса записи FAT32 в кэше. GET_FAT16_CELL: Вход: HL = номер кластера Выход: HL = адрес ячейки в кэше FATPAGE Портит: AF, BC, DE, HL Описание: вычисление адреса записи FAT16. GET_FAT12_CELL: Вход: HL = номер кластера Выход: HL = адрес ячейки в кэше FATPAGE, CF = чётность номера Портит: AF, BC, DE, HL Описание: вычисление адреса записи FAT12. CLUSTER_TO_SECTOR: Вход: HL':HL = номер кластера Выход: HL:IX = номер первого сектора данных кластера Портит: AF, BC, DE, HL, IX Описание: преобразование номера кластера в абсолютный номер сектора. BLOCK_READ: Вход: HL:DE = смещение в секторах от начала файла, IY = FM, IX = буфер, B = кол-во секторов Выход: CF=0 данные прочитаны, CF=1 ошибка Портит: AF, BC, DE, HL, IX Описание: чтение нескольких секторов файла с учётом цепочки кластеров. BLOCK_WRITE: Вход: HL:DE = смещение в секторах от начала файла, IX = данные, IY = FM, B = кол-во секторов Выход: CF=0 данные записаны, CF=1 ошибка Портит: AF, BC, DE, HL, IX Описание: запись секторов файла, расширение цепочки при необходимости. CHECK_FIRST_CLUSTER: Вход: IY = FM Выход: ZF=1 первый кластер = 0, HL':HL = первый кластер Портит: AF, HL Описание: проверка наличия первого кластера в файловом манипуляторе. GetSavedCluster: Вход: IY = FM, DE:BC = смещение в кластерах от начала файла Выход: если возможно, используется сохранённый кластер и смещение сокращается Портит: AF, HL, DE, BC Описание: оптимизация поиска кластера по файлу с использованием ранее сохранённой позиции. SaveGotCluster: Вход: IY = FM, DE:BC = смещение, HL':HL = текущий кластер Выход: сохраняет позицию для будущих вызовов GetSavedCluster Портит: AF Описание: запоминание соответствия смещения и номера кластера. WRITE_DATE_TIME_TO_DIRECTORY_RECORD: Вход: HL = указатель на запись каталога Выход: HL = следующий адрес после записанных даты/времени Портит: AF, BC, DE, HL Описание: заполнение полей времени и даты в записи каталога. GET_OFFSET_IN_SECTORS: Вход: IY = FM Выход: HL:DE = FP в секторах, BC = остаток в байтах Портит: AF, BC, DE, HL Описание: перевод файловой позиции в секторы и остаток. READ_FAT_TABLE: Вход: DE = новый номер блока FAT Выход: блок FAT загружен в кэш FATPAGE, CF=0 Портит: AF, BC, DE, HL Описание: чтение нужного блока FAT в кэш. WRITE_FAT_TABLE: Вход: (FATPAGE) содержит изменённый кэш FAT Выход: изменённые регионы кэша записаны на диск Портит: AF, BC, DE, HL Описание: сброс кэша FAT на диск (включая FSInfo). ████████████████████████████████████████████████████████████████████ Procedures.asm ████████████████████████████████████████████████████████████████████ MK_TIME: Вход: DE = день/месяц, HL = часы/минуты, B = секунды, IX = год Выход: DE = время (hhhhhmmmmmmsssss), BC = дата (yyyyyyymmmmddddd) Портит: AF, BC, DE, HL, IX Описание: упаковка даты и времени в формат FAT. RMKTIME: Вход: DE = время, BC = дата Выход: D = день, E = месяц, H = час, L = минуты, B = секунды, IX = год Портит: AF, BC, DE, HL, IX Описание: распаковка даты и времени из формата FAT. CalcDayOfWeek: Вход: D = день, E = месяц, IX = год Выход: H = день недели (1=воскресенье) Портит: AF, BC, DE, HL, IX Описание: вычисление дня недели по дате. UPPER: Вход: A = символ Выход: A = символ в верхнем регистре (с учётом русских букв) Портит: AF Описание: преобразование латиницы и кириллицы в верхний регистр. RCMOS: Вход: D = номер регистра CMOS Выход: A = значение (HEX), CF=0 есть часы, CF=1 нет Портит: AF, D Описание: чтение регистра CMOS с преобразованием BCD->HEX. BCD2HEX: Вход: A = BCD-число Выход: A = HEX Портит: AF, DE Описание: преобразование двоично-десятичного в двоичное. WCMOS: Вход: D = номер регистра, A = значение (HEX) Выход: CF=0 успех Портит: AF Описание: запись в CMOS с преобразованием HEX->BCD. HEX2BCD: Вход: A = HEX-число Выход: A = BCD Портит: AF, BC Описание: преобразование двоичного в BCD. BC_Div_DE: Вход: BC = делимое, DE = делитель Выход: BC = частное, HL = остаток Портит: AF, BC, HL Описание: целочисленное деление BC/DE. DIV_by_Shifts: Вход: HL:DE = делимое, A = делитель (степень двойки через сдвиги) Выход: DE:BC = частное, HL = остаток Портит: AF, BC, DE, HL Описание: деление с использованием сдвигов (делитель задан как степень двойки). KERNEL_PANIC: Вход: E = координата X, HL = сообщение, BC = длина сообщения Выход: - Портит: всё Описание: фатальная ошибка с выводом сообщения на экран и остановом. ████████████████████████████████████████████████████████████████████ MOUSE.ASM ████████████████████████████████████████████████████████████████████ API: Вход: C = номер функции мыши (0..15 или 80h..83h), другие регистры зависят от функции Выход: зависит от функции Портит: различные Описание: диспетчер функций мыши. MS_INIT: Вход: - Выход: CF=0 мышь обнаружена, CF=1 отсутствует Портит: AF, BC Описание: инициализация последовательного порта мыши. MS_SHOW: Вход: - Выход: курсор мыши отображается на экране Портит: AF Описание: включение видимости курсора мыши. MS_HIDD: Вход: - Выход: курсор мыши скрыт Портит: AF Описание: выключение видимости курсора мыши. MS_READ: Вход: - Выход: HL = X, DE = Y, A = кнопки Портит: - Описание: чтение текущей позиции и состояния кнопок. MS_GOTO: Вход: HL = X, DE = Y Выход: курсор перемещён Портит: AF, HL, DE Описание: установка позиции курсора мыши. MS_CURS: Вход: IX = образ курсора, H = высота, L = ширина, D = Y горячей точки, E = X Выход: CF=0 успех, CF=1 ошибка (слишком большой образ) Портит: AF, BC, DE, HL Описание: загрузка графического образа курсора мыши. MS_BCUR: Вход: IX = буфер для сохранения текущего образа Выход: H/Y = размеры, D/E = горячая точка, образ скопирован Портит: AF, BC, DE, HL Описание: получение текущего образа курсора. MS_HORZ: Вход: HL = мин. X, DE = макс. X Выход: A=0 Портит: - Описание: установка горизонтальных границ перемещения. MS_VERT: Вход: HL = мин. Y, DE = макс. Y Выход: A=0 Портит: - Описание: установка вертикальных границ. MS_MASK: Вход: HL = AND/EXOR маски символа, DE = AND/EXOR маски атрибута Выход: A=0 Портит: - Описание: установка масок для текстового курсора. MS_SENT: Вход: H = чувствительность по вертикали, L = по горизонтали Выход: A=0 Портит: - Описание: установка чувствительности мыши. MS_GSEN: Вход: - Выход: HL = чувствительности Портит: - Описание: получение чувствительности. RESTORE: Вход: координаты сохранены в переменных Выход: восстанавливает участок экрана под курсором Портит: AF, BC, DE, HL Описание: восстановление фона при перемещении мыши. MOUSE: Вход: HL = X, DE = Y Выход: рисует курсор мыши в указанной позиции Портит: AF, BC, DE, HL, IX Описание: отрисовка курсора мыши. READ_M: Вход: - Выход: CF=1 пакет получен (DE = X/Y перемещение, A = кнопки) Портит: AF, BC, DE, HL Описание: чтение пакета данных от мыши. CLEAR_MOUSE_BUFFER: Вход: - Выход: очистка приёмного буфера SIO Портит: AF Описание: сброс данных от мыши при ошибке. CONTROL: Вход: - Выход: обрабатывает перемещение мыши, обновляет координаты Портит: AF, BC, DE, HL Описание: полный цикл обработки перемещения. REFRESH: Вход: флаг (REFRESH.hide) Выход: при необходимости перерисовывает курсор Портит: AF, BC, DE, HL Описание: обновление изображения курсора при изменении экрана. M_MODE: Вход: A = режим экрана Выход: устанавливает границы перемещения в зависимости от режима Портит: AF, HL, DE Описание: адаптация мыши к смене видеорежима. ████████████████████████████████████████████████████████████████████ ata_atapi-drv.asm ████████████████████████████████████████████████████████████████████ IDE_DRV.API_TABLE: Вход: C = команда (0..11) Выход: переход на обработчик Портит: - Описание: диспетчер команд ATA/ATAPI драйвера. Init: Вход: C=0 Выход: A = количество обнаруженных устройств Портит: AF, BC, DE, HL, IX, IY Описание: инициализация IDE-устройств, заполнение таблиц LOGDRV. Open: Вход: C=1, A = номер диска Выход: CF=0 успех Портит: AF, IY Описание: открытие диска, проверка смены носителя. Close: Вход: C=2, A = номер диска Выход: A=0 Портит: - Описание: закрытие диска (ничего не делает). MediaCheck: Вход: C=3, A = номер диска Выход: A=0 не менялся, A=FF менялся, CF=1 ошибка Портит: AF, IY Описание: проверка смены носителя (с переопределением разделов при необходимости). GetBPB: Вход: C=4, A = номер диска, DE = буфер Выход: CF=0 BPB прочитан Портит: AF, BC, HL, IX Описание: чтение boot-сектора для получения BPB. Read: Вход: C=5, HL:IX = сектор, DE = адрес, B = кол-во, A = диск Выход: CF=0 успех Портит: AF, BC, HL, IX, IY Описание: чтение секторов. Write: Вход: C=6, HL:IX = сектор, DE = адрес, B = кол-во, A = диск Выход: CF=0 успех Портит: AF, BC, HL, IX, IY Описание: запись секторов. Removable: Вход: C=7, A = диск Выход: A=1 (сменный) Портит: - Описание: всегда возвращает признак сменного носителя. GenIOCTL: Вход: C=8, B=подкоманда (00..03, 80..82), A = диск, DE = 55AAh Выход: зависит от подкоманды Портит: различные Описание: дополнительные IOCTL-команды. ReadLong: Вход: C=10, HL:IX = сектор, DE = адрес, B = кол-во, A = диск, A' = страница Выход: CF=0 данные прочитаны с переключением страниц Портит: AF, BC, HL, IX, IY Описание: чтение с автопереключением страниц. WriteLong: Вход: C=11, аналогично ReadLong Выход: CF=0 успех Портит: AF, BC, HL, IX, IY Описание: запись с автопереключением страниц. SelectDrive (и .NoSector): Вход: A = номер диска, HL:IX = сектор (для .NoSector без коррекции) Выход: CF=0 подготовлено, A = физический номер драйва, HL:IX скорректированы Портит: AF, DE, HL, IX, IY Описание: выбор логического диска и пересчёт смещения. GetMoreParams: Вход: A = номер диска Выход: HL':HL:DE = смещение раздела Портит: IX, IY Описание: получение дополнительных параметров раздела. ReDEFINE_PARTITIONS: Вход: (CURRENT_DRIVE) заполнен Выход: переопределяет разделы для указанного устройства Портит: AF, BC, DE, HL, IX, IY Описание: пересканирование разделов при смене носителя. DEFINE_PARTITIONS: Вход: B = флаги сменного носителя, (CURRENT_DRIVE.Number) Выход: обновляет таблицу LOGDRV Портит: многие Описание: определение и регистрация разделов FAT на ATA/ATAPI устройствах. ████████████████████████████████████████████████████████████████████ fdd-drv.asm ████████████████████████████████████████████████████████████████████ FDD_DRV.API_TABLE: Вход: C = команда (0..8) Выход: переход на обработчик Портит: - Описание: диспетчер команд FDD драйвера. Init: Вход: C=0 Выход: A=2 (количество FDD) Портит: - Описание: инициализация FDD. Open: Вход: C=1, A = номер диска (0..1) Выход: CF=0 успех, CF=1 ошибка Портит: AF, IY Описание: сброс контроллера и получение параметров дискеты. Close: Вход: C=2 Выход: A=0 Портит: - Описание: закрытие (ничего не делает). MediaCheck: Вход: C=3, A = диск Выход: A=0 не менялся (если NON_REMOVABLE_FDD) или A=FF (всегда менялся, если не NON_REMOVABLE) Портит: AF Описание: проверка смены дискеты (условная). GetBPB: Вход: C=4, A = диск, DE = буфер Выход: CF=0 BPB прочитан Портит: AF, BC, DE, HL, IX Описание: чтение boot-сектора и настройка геометрии. Read: Вход: C=5, HL:IX = сектор, DE = буфер, B = кол-во, A = диск Выход: CF=0 успех Портит: AF, IY Описание: чтение секторов. Write: Вход: C=6, аналогично Read Выход: CF=0 успех Портит: AF, IY Описание: запись секторов. Removable: Вход: C=7 Выход: A=1 Портит: - Описание: всегда возвращает признак сменного носителя. GenIOCTL: Вход: C=8, B=подкоманда (00h Get/80h Set), A = диск Выход: зависит от команды Портит: AF, HL, DE, BC Описание: получение/установка геометрии дисковода. ████████████████████████████████████████████████████████████████████ ram_disk-drv.asm ████████████████████████████████████████████████████████████████████ RAMDSK_DRV.API_TABLE: Вход: C = команда (0..11) Выход: переход на обработчик Портит: - Описание: диспетчер команд RAM-диска. Init: Вход: C=0 Выход: A = количество RAM-дисков Портит: AF, BC, DE, HL Описание: инициализация RAM-дисков, заполнение RAMDTBL. Open/Close/Removable: Вход: C=1/2/7 Выход: A=0 Портит: - Описание: заглушки (ничего не делают). MediaCheck: Вход: C=3 Выход: A=0 (не менялся) Портит: - Описание: заглушка. GetBPB: Вход: C=4, DE = буфер, A = диск Выход: читает boot-сектор из RAM-диска Портит: AF, BC, HL, IX Описание: чтение BPB из RAM-диска. Read: Вход: C=5, HL:IX = сектор, DE = адрес, B = кол-во, A = диск Выход: CF=0 успех Портит: AF, BC, HL Описание: чтение секторов RAM-диска. Write: Вход: C=6, аналогично Read Выход: CF=0 успех Портит: AF, BC, HL Описание: запись секторов RAM-диска. ReadLong/WriteLong: Аналогично Read/Write с переключением страниц. GenIOCTL: Вход: C=8, B=подкоманда (00h GetParams и т.п.), A = диск Выход: зависит от подкоманды Портит: AF, HL, DE, BC Описание: получение геометрии RAM-диска. GET_RAMDRV_NUM: Вход: A = логический номер RAM-диска Выход: A = физический номер блока (OR 60h) Портит: AF, BC Описание: преобразование логического номера в физический. ████████████████████████████████████████████████████████████████████ Shared.asm / ReScanDRV.ASM ████████████████████████████████████████████████████████████████████ INITDVC: Вход: - Выход: A=0 Портит: AF, BC, DE, HL Описание: инициализация таблиц драйверов, вызов Init для FDD, IDE, RAM-дисков. MAKEDVC: Вход: A = количество устройств данного типа, DE = адрес API_TABLE драйвера Выход: регистрирует устройства в таблице DEVICE Портит: AF, BC, HL Описание: заполнение таблицы DEVICE для одного типа устройств. GET_LOGDRV_ENTRY: Вход: L = логический номер диска Выход: IY = указатель на запись в LOGDRV Портит: HL, DE, IY Описание: поиск записи логического диска. CONVERT_SECTOR_SIZE: Вход: IX = размер сектора в байтах Выход: A = код размера (1,2,4,8...) Портит: AF, E Описание: преобразование размера сектора в код для BIOS. INTDISK: Вход: A = номер диска (0..25), C = команда драйвера Выход: переход на соответствующий драйвер Портит: HL Описание: диспетчер вызова драйверов накопителей. ReScanDRV (из ReScanDRV.ASM): Вход: B = старая буква бут-диска Выход: CF=0 успех, CF=1 ошибка (бут-диск исчез) Портит: AF, BC, DE, HL, IX, IY Описание: пересканирование всех накопителей, обновление таблиц, освобождение FM при пропаже диска. ████████████████████████████████████████████████████████████████████ DRV_TO_SYS_ERRORS.ASM ████████████████████████████████████████████████████████████████████ DRV_ERROR_TO_SYS: Вход: CF=1 (ошибка драйвера), A = код ошибки драйвера Выход: A = код системной ошибки (DSS_Error.sys.*) Портит: AF Описание: преобразование ошибок драйверов в ошибки файловой системы. ████████████████████████████████████████████████████████████████████ AppInfo.asm ████████████████████████████████████████████████████████████████████ APPINFO: Вход: HL = буфер данных, B = 0 ? получить параметры ком.строки, 1 ? путь к каталогу программы, 2 ? полный путь к EXE, >2 ? ошибка Выход: CF=0 данные скопированы в буфер, CF=1 A=INVALID_FUNCTION при B>2 Портит: AF, BC, DE, HL Описание: диспетчер подфункций #47. ████████████████████████████████████████████████████████████████████ Attribute.asm ████████████████████████████████████████████████████████████████████ ATTRIB: Вход: HL = строка пути, A = атрибут (для SET), B = 0 GET, 1 SET, иначе ошибка Выход: CF=0: GET -> A = текущий атрибут, SET -> A = установленный атрибут, CF=1: A = код ошибки Портит: AF, BC, DE, HL, IX, IY (через OPEN_FN.FM и др.) Описание: чтение/установка атрибутов файла (функция #16). ████████████████████████████████████████████████████████████████████ bootDsk.asm ████████████████████████████████████████████████████████████████████ BOOTDSK: Вход: B = 0 (GET) или 1 (SET: H=устройство, L=раздел) Выход: CF=0: GET -> A = номер загрузочного диска (0..), SET -> модифицирует код (запрещает повторный SET), A=0 CF=1: ошибка (INVALID_FUNCTION или диск не найден при SET) Портит: AF, BC, DE, HL, IY (при сканировании) Описание: чтение/установка номера системного диска (функция #09). ████████████████████████████████████████████████████████████████████ ChDir.asm ████████████████████████████████████████████████████████████████████ CHDIR_FN: Вход: HL = строка пути к каталогу Выход: CF=0 успех (меняет текущий каталог), CF=1 ошибка (A=код ошибки) Портит: AF, HL, DE, BC, IY Описание: функция #1D ? смена текущего каталога, с проверкой пути. CHDIR: Вход: HL = строка пути (может быть NULL) Выход: CF=0 успех, CF=1 ошибка Портит: AF, HL, DE, IY Описание: внутренняя процедура установки каталога (через SetPath_GetName и OPENDIR). ████████████████████████████████████████████████████████████████████ ChDisk.asm ████████████████████████████████████████████████████████████████████ CHDISK_FN: Вход: A = номер диска (0..) Выход: CF=0 успех (меняет текущий диск и каталог), CF=1 ошибка Портит: AF, HL, DE, BC Описание: функция #01 ? смена текущего диска. CHDISK: Вход: A = номер диска Выход: CF=0 успех (открыт новый диск, корневой каталог загружен), CF=1 ошибка Портит: AF, HL, DE, BC, IY Описание: открытие логического диска, сброс WorkDirectory, вызов OPENDIR для корня. ████████████████████████████████████████████████████████████████████ Clear.asm ████████████████████████████████████████████████████████████████████ CLEAR: Вход: D = строка, E = столбец, H = высота, L = ширина, A = символ-заполнитель, B = атрибут Выход: окно очищено Портит: AF, BC, DE, HL (параметры уходят в BIOS.LP_CLS_WIN2) Описание: функция #56 ? очистка прямоугольной области экрана. ████████████████████████████████████████████████████████████████████ Close.asm ████████████████████████████████████████████████████████████████████ CLOSE_FN: Вход: A = файловый манипулятор Выход: CF=0 успех (файл закрыт, запись каталога обновлена), CF=1 ошибка Портит: AF, BC, DE, HL, IX, IY (практически все) Описание: функция #12 ? закрытие файла со сбросом изменений в каталог. ████████████████████████████████████████████████████████████████████ Create.asm ████████████████████████████████████████████████████████████████████ CREATE: Вход: HL = имя файла, A = атрибут Выход: CF=0 -> A = файловый манипулятор, CF=1 -> A = код ошибки Портит: AF, BC, DE, HL, IX, IY Описание: функция #0A ? создать файл (если существует ? перезаписывается). CREATE.NEW (метка .NEW): Вход: HL = имя файла, A = атрибут Выход: CF=0 -> A = файловый манипулятор, CF=1 -> A = FILE_EXISTS или другая ошибка Портит: как CREATE Описание: функция #0B ? создать файл, если не существует. .Prepare (CREATE/ .NEW): Вход: HL = имя, A = атрибут Выход: CF=0 подготовлен TMPNAME и MASK, сохранены .TMP и .PATH0, CF=1 ошибка Портит: AF, BC, DE, HL Описание: общая часть подготовки для CREATE/.NEW. ████████████████████████████████████████████████████████████████████ curDisk.asm ████████████████████████████████████████████████████████████████████ CURDISK_FN: Вход: нет Выход: A = текущий диск, C = номер последнего диска в системе Портит: AF, BC Описание: функция #02 ? получить номер текущего диска. CURDISK: Вход: нет Выход: A = текущий диск (из FS_Buffer.DRIVE), C = LDRIVE Портит: AF, BC Описание: низкоуровневое получение номера текущего диска. ████████████████████████████████████████████████████████████████████ CurrDir.asm ████████████████████████████████████████████████████████████████████ CURRDIR (точка входа из CHDIR и др.): Вход: HL = буфер 256 байт Выход: CF=0 скопирован WorkDirectory в буфер, CF=1 ошибка переполнения Портит: AF, BC, DE, HL Описание: копирование рабочего каталога в буфер. CURRDIR_FN: Вход: HL = буфер 256 байт Выход: CF=0 скопирован CurrentDirectory в буфер, CF=1 ошибка Портит: AF, BC, DE, HL Описание: функция #1E ? получить текущий каталог. ████████████████████████████████████████████████████████████████████ Cursor.asm ████████████████████████████████████████████████████████████████████ CURSOR: Вход: нет Выход: D = строка, E = столбец позиции курсора Портит: AF, (BC, HL ? сбрасываются BIOS) Описание: функция #53 ? получить положение курсора. ████████████████████████████████████████████████████████████████████ Delete.asm ████████████████████████████████████████████████████████████████████ DEL_FN: Вход: HL = имя файла (без * и ?) Выход: CF=0 успех (файл удалён), CF=1 ошибка Портит: AF, BC, DE, HL, IX, IY Описание: функция #0E ? удаление файла. ████████████████████████████████████████████████████████████████████ diskINF.asm ████████████████████████████████████████████████████████████████████ DISKINF: Вход: A = номер диска (0..25, #FF ? текущий), B = 0 не считать свободное место, !=0 считать, HL = буфер расширенной информации (если A bit7=1) Выход: CF=0: A = размер кластера в секторах, HL':HL = общее количество кластеров, DE':DE = количество свободных кластеров, BC = размер сектора в байтах, буфер заполнен доп. информацией, CF=1: A = код ошибки Портит: AF, BC, DE, HL, IX, IY (и теневые) Описание: функция #03 ? информация о диске. GetFreeSpace: Вход: (FS_Buffer) готов Выход: BC':BC = количество свободных кластеров Портит: AF, BC, DE, HL (и теневые) Описание: подсчёт свободных кластеров путём сканирования FAT. GET_LABEL: Вход: DE = буфер для метки (11 байт) Выход: CF=0 ? метка из корневого каталога или BPB, CF=1 ? метка из BPB (LABEL) Портит: AF, BC, DE, HL, IX, IY Описание: поиск метки тома (сначала поиск в корне, потом BPB). ████████████████████████████████████████████████████████████████████ DosName.asm ████████████████████████████████████████████████████████████████████ DOSNAME: Вход: B = 0 ? 11-байтовое имя в DOS, HL=11байт, DE=буфер для DOS; 1 ? DOS-имя в 11 байт, HL=строка, DE=11байт буфер; иначе ? ошибка Выход: CF=0 преобразованное имя в буфере, CF=1 A=INVALID_FUNCTION Портит: AF, BC, DE, HL Описание: функция #44 ? преобразование форматов имён. ████████████████████████████████████████████████████████████████████ Environ.asm ████████████████████████████████████████████████████████████████████ ENVIRON: Вход: B = #FF инициализация, 0 ? получить всё окружение (HL = буфер), 1 ? получить переменную (HL = имя, DE = буфер), 2 ? установить/удалить переменную (HL = ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ) Выход: зависит от подфункции, CF=0 успех, CF=1 ошибка Портит: практически все Описание: функция #46 ? работа с системным окружением. INITENV: Вход: нет Выход: окружение инициализировано (DEFAULT_ENV, BOOTDSK) Портит: AF, BC, DE, HL Описание: инициализация буфера окружения. READENV: Вход: HL = буфер Выход: всё окружение скопировано в буфер Портит: AF, BC, DE, HL (EXX) Описание: копирование всего окружения в пользовательский буфер. GETENV: Вход: HL = имя переменной, DE = буфер для значения Выход: CF=0 ? A=0 переменная не найдена, A=#FF найдена (DE указывает на конец), буфер заполнен Портит: AF, BC, DE, HL Описание: поиск и копирование значения переменной окружения. SETENV: Вход: HL = ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ (0 в конце) Выход: CF=0 успех (добавлена/изменена/удалена) Портит: AF, BC, DE, HL Описание: установка или удаление переменной окружения. F_ENV: Вход: (ENVNAME) = имя искомой переменной, (ENVIRONMENT) ? текущее окружение Выход: CF=0 не найдена (DE указывает на конец окружения), CF=1 найдена (HL = адрес значения, DE = начало значения) Портит: AF, BC, DE, HL Описание: поиск переменной в окружении. ENV_EX: Вход: HL = строка "ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ" Выход: строка разобрана, ENVNAME содержит имя, ENVVALUE содержит значение, CF=1 если слишком длинная строка (обрезается) Портит: AF, BC, DE, HL Описание: разделение имени и значения переменной окружения. ████████████████████████████████████████████████████████████████████ Ex_Path.asm ████████████████████████████████████████████████████████████████████ EX_PATH: Вход: HL = командная строка, DE = буфер пользователя, B = номер подфункции (0..9) Выход: зависит от подфункции, CF=1 при ошибке Портит: AF, BC, DE, HL (EXX) Описание: функция #45 ? разбор командной строки. .FULL (внутренняя): Вход: HL = строка, DE = буфер (не используется прямо) Выход: CF=0 заполнены внутренние буферы NM_DRIVE,NM_PATH,NM_NAME,NM_EXTN, битовые флаги в A' Портит: AF, BC, DE, HL (EXX) Описание: полный разбор пути. ████████████████████████████████████████████████████████████████████ Execute.ASM ████████████████████████████████████████████████████████████████████ EXEC: Вход: HL = указатель на имя EXE-файла, B = 0 ? короткое имя (поиск в PATH), 1 ? полное имя Выход: CF=0 ? успешный запуск (возврат после завершения программы), CF=1 ? A = код ошибки Портит: практически все Описание: функция #40 ? загрузка и выполнение EXE. EXEC_1: Вход: HL = имя файла Выход: CF=0 файл открыт (A = FM), TASK увеличен, идёт EXEC02, CF=1 ошибка (TASK восстановлен) Портит: AF, BC, DE, HL Описание: открытие EXE, проверка расширения, переход к запуску. EXEC02: Вход: A = файловый манипулятор Выход: управление передаётся программе (RETFAR или _TST_PROC) Портит: всё Описание: загрузка EXE-заголовка, выделение памяти, создание PSP, запуск. RETFAR: Вход: нет (вызывается при RST 0) Выход: передаёт управление LEAVE с кодом UNEXPECTED_APP_TRMN Портит: B Описание: точка входа при неожиданном завершении приложения. LEAVE: Вход: B = код завершения Выход: не возвращается (восстанавливает стек и состояние DSS) Портит: всё Описание: функция #41 ? завершение процесса. GET_ERR: Вход: нет Выход: A = код завершения последнего процесса Портит: AF Описание: функция #42 ? получить код возврата. TST_EXT: Вход: (MASKARE+8) ? расширение файла Выход: CF=0 расширение "EXE" или не указано (подставлено "EXE"), CF=1 не совпадает Портит: AF, BC, DE, HL Описание: проверка/подстановка расширения EXE. _TST_PROC: Вход: B = количество страниц памяти для загрузки Выход: переключает стек, выделяет память, подключает страницы, вызывает загрузчик через (_ret) Портит: всё Описание: подготовка к загрузке основного кода. _TST_PROC_2: Вход: (EXE_MEM) ? ID блока, (CMDLINE) ? командная строка и т.д. Выход: передача управления EXE (с адресом RETFAR на стеке) Портит: всё Описание: окончательная настройка и запуск EXE. M_PSP: Вход: (CORE_BUFFERS.EXEBUFF.LD_ADDR) ? адрес загрузки Выход: PSP сформирован, IX указывает на его начало, обновлён APPINFO.LAST_PSP_PTR Портит: AF, BC, DE, HL, IX Описание: построение префикса программного сегмента (PSP). SCOPYS: Вход: HL = командная строка, DE = буфер назначения Выход: строка скопирована (первый пробел отброшен, ограничение 128 байт), B = остаток длины Портит: AF, BC, DE, HL Описание: копирование параметров командной строки. FREE_PROCESS_MEMORY: Вход: (TASK) ? номер задачи Выход: все блоки памяти, принадлежащие задаче, освобождены Портит: AF, BC, DE, HL Описание: освобождение памяти при завершении процесса. FREE_PROCESS_FMs: Вход: (TASK) ? номер задачи Выход: все файловые манипуляторы задачи закрыты (CLOSE_FN) Портит: AF, BC, DE, HL, IY Описание: закрытие файлов процесса при завершении. CHECKPATH: Вход: HL = строка Выход: CF=1 ? содержит '\' (абсолютный путь), CF=0 ? нет Портит: AF, HL Описание: проверка наличия символа '\' в строке. FINDPATH: Вход: (CMDLINE) ? имя файла, (ENVPAGE.ENVTEMP) ? переменная PATH Выход: CF=0 файл найден (открыт, маска подготовлена), CF=1 не найден Портит: AF, BC, DE, HL, IX, IY Описание: поиск исполняемого файла в путях из переменной PATH. ████████████████████████████████████████████████████████████████████ Find.asm ████████████████████████████████████████████████████████████████████ F_FIRST_FN: Вход: HL = маска файла, DE = буфер 44/256 байт, A = атрибуты поиска, B = 0 (FAT имя) / 1 (DOS имя) Выход: CF=0 найден первый файл, буфер заполнен, CF=1 ошибка Портит: AF, BC, DE, HL, IX, IY Описание: функция #19 ? начать поиск файлов в каталоге. F_FIRST: Вход: как F_FIRST_FN, но без проверки пути (вызывается внутренне) Выход: аналогично Портит: аналогично F_NEXT: Вход: DE = буфер (неявно использует предыдущий контекст поиска) Выход: CF=0 найден следующий файл, буфер заполнен, CF=1 ошибка (в т.ч. конец списка) Портит: AF, BC, DE, HL, IX Описание: функция #1A ? продолжить поиск файлов. .INIT_VARS (F_FIRST): Вход: A=атрибут, DE=буфер, B=режим Выход: сохранены (.SEARCH_ATTRIBUT), (.DTABUF), (.FNDMODE) Портит: AF Описание: инициализация переменных поиска. .FIND_S (F_FIRST): Вход: IX = текущая запись в DIRPAGE, DE = адрес буфера результата Выход: буфер заполнен информацией о найденном файле, CF=0 успех Портит: AF, BC, DE, HL, IX Описание: копирование данных найденной записи в буфер пользователя. .NSEARCH (F_NEXT): Вход: A = атрибут предыдущего найденного файла, (F_NEXT.CURHND) ? указатель Выход: IX = следующая запись, CF=0 есть, CF=1 конец или ошибка Портит: AF, IX Описание: продвижение по каталогу к следующей записи. ████████████████████████████████████████████████████████████████████ FreeMem.asm ████████████████████████████████████████████████████████████████████ FREEMEM: Вход: нет Выход: HL = общее число страниц, BC = число свободных страниц Портит: AF, BC, HL Описание: функция #3C ? объём памяти. ████████████████████████████████████████████████████████████████████ GetDateTime.asm ████████████████████████████████████████████████████████████████████ GET_D_T: Вход: A = файловый манипулятор Выход: CF=0: D = день, E = месяц, IX = год, H = час, L = минуты, B = секунды CF=1: A = код ошибки Портит: AF, BC, DE, HL, IX Описание: функция #17 ? получение даты/времени файла. ████████████████████████████████████████████████████████████████████ GetMem.asm ████████████████████████████████████████████████████████████████████ GETMEM: Вход: B = размер в страницах (16KB) Выход: CF=0 -> A = идентификатор блока памяти, CF=1 -> A = NOT_ENOUGH_MEMORY Портит: AF, DE, HL Описание: функция #3D ? выделить блок памяти. ████████████████████████████████████████████████████████████████████ GetVMod.asm ████████████████████████████████████████████████████████████████████ GETVMOD: Вход: нет Выход: A = текущий режим экрана, B = страница экрана (0/1) Портит: AF, B Описание: функция #51 ? получить видеорежим. ████████████████████████████████████████████████████████████████████ GSwitch.asm ████████████████████████████████████████████████████████████████████ GSWITCH: Вход: HL = командная строка, DE = буфер для параметра Выход: CF=0 параметр выделен (HL ? след. позиция), CF=1 конец строки (буфер пуст) Портит: AF, BC, DE, HL Описание: функция #43 ? выделить очередной параметр ком.строки. ████████████████████████████████████████████████████████████████████ Lib_Sub.asm ████████████████████████████████████████████████████████████████████ LIB_SUB: Вход: B = 1 ? вызов SETUP_CURSORS (восстановление шрифтов) Выход: CF=0 успех, CF=1 при B<>1 Портит: AF (при B<>1) Описание: функция #5D ? библиотечные подфункции. ████████████████████████████████████████████████████████████████████ Locate.asm ████████████████████████████████████████████████████████████████████ LOCATE: Вход: D = строка, E = столбец Выход: позиция курсора установлена Портит: AF (параметры в BIOS.LP_SET_PLACE) Описание: функция #52 ? установить позицию курсора. ████████████████████████████████████████████████████████████████████ MkDir.asm ████████████████████████████████████████████████████████████████████ MKDIR (и .B): .B ? точка входа для функции #1B с проверкой пути. Вход: HL = имя создаваемого каталога Выход: CF=0 каталог создан, CF=1 ошибка Портит: AF, BC, DE, HL, IX, IY Описание: создание нового каталога, включая записи "." и "..". .START: Вход: HL = имя каталога Выход: CF=0 каталог создан (HANDBUF, запись в каталоге, кластер) Портит: практически все Описание: основная логика создания каталога. ████████████████████████████████████████████████████████████████████ Move_FP.asm ████████████████████████████████████████████████████████████████████ MOVE_FP: Вход: HL:IX = смещение, A = файловый манипулятор, B = 0 от начала, 1 от текущей, 2 от конца; иначе ошибка Выход: CF=0 позиция изменена, CF=1 ошибка (INVALID_FUNCTION) Портит: AF, BC, DE, HL, IX Описание: функция #15 ? управление файловым указателем. ████████████████████████████████████████████████████████████████████ Open.asm ████████████████████████████████████████████████████████████████████ OPEN_FN: Вход: HL = имя файла, A = режим доступа (0 RW, 1 R, 2 W) Выход: CF=0 -> A = файловый манипулятор, CF=1 -> A = код ошибки Портит: AF, BC, DE, HL, IX, IY Описание: функция #11 ? открыть файл. .FILE (OPEN_FN): Вход: HL = maska, (TMPNAME) подготовлен Выход: CF=0 файл найден, запись в HANDBUF, DE = record index Портит: AF, BC, DE, HL, IX Описание: поиск записи файла и загрузка в HANDBUF. .FM (OPEN_FN): Вход: DE = record index, (HANDBUF) ? запись каталога Выход: CF=0 -> FM выделен и заполнен, A = номер FM Портит: AF, BC, DE, HL, IY Описание: выделение FM и копирование в него данных из HANDBUF. ████████████████████████████████████████████████████████████████████ PChars.asm ████████████████████████████████████████████████████████████████████ PCHARS: Вход: HL = строка с нулём в конце, A = атрибут (или 0) Выход: строка выведена на экран (с учётом управляющих символов) Портит: AF, BC, DE, HL, IY Описание: функция #5C ? вывод строки символов на консоль. PCHARS.NO_SCROLL (локальная метка, используется PutChar): Вход: A != 0 ? без скролла, HL -> строка или символ на стеке, CF и т.д. Выход: символ выведен Портит: AF, BC, DE, HL, IY Описание: универсальный вывод с использованием BIOS.LP_PR_LINE_DIR. ████████████████████████████████████████████████████████████████████ Print.asm ████████████████████████████████████████████████████████████████████ PRINT: Вход: A = символ для печати Выход: CF=0 символ отправлен на принтер (B = символ), CF=1 ошибка/занят (A = байт состояния) Портит: AF, BC Описание: функция #5F ? вывод символа на принтер. PRINT_INIT: Вход: нет Выход: порт принтера инициализирован Портит: AF, BC Описание: инициализация параллельного порта (вызывается при старте). ████████████████████████████████████████████████████████████████████ PutChar.asm ████████████████████████████████████████████████████████████████████ PUTCHAR: Вход: A = символ Выход: символ выведен в текущую позицию (с обработкой CR,LF,TAB и т.п.) Портит: AF, BC, DE, HL, IY Описание: функция #5B ? вывод символа на экран с прокруткой. PUTCHAR.NO_SCROLL: Вход: A = символ, C = 0 ? обычный вывод, C !=0 ? без скролла Выход: символ выведен (без обработки управляющих символов) Портит: AF, BC, DE, HL (через PCHARS.NO_SCROLL) Описание: вывод символа без скролла и обработки спецсимволов. ████████████████████████████████████████████████████████████████████ RdChar.asm ████████████████████████████████████████████████████████████████████ RDCHAR: Вход: D = строка, E = колонка Выход: A = символ, B = атрибут Портит: AF, BC, HL Описание: функция #57 ? прочитать символ с экрана. ████████████████████████████████████████████████████████████████████ Read.asm ████████████████████████████████████████████████████████████████████ READ: Вход: HL = адрес буфера, DE = размер, A = файловый манипулятор Выход: CF=0 -> DE = реально прочитанный размер (может быть меньше), CF=1 ошибка Портит: AF, BC, DE, HL, IX, IY (и стек) Описание: функция #13 ? чтение данных из файла. ████████████████████████████████████████████████████████████████████ Rename.asm ████████████████████████████████████████████████████████████████████ RENAME: Вход: HL = старое имя, DE = новое имя Выход: CF=0 успех, CF=1 ошибка Портит: AF, BC, DE, HL, IX, IY Описание: функция #10 ? переименование файла. ████████████████████████████████████████████████████████████████████ RetMem.asm ████████████████████████████████████████████████████████████████████ RETMEM: Вход: A = идентификатор блока памяти Выход: CF=0 блок освобождён, CF=1 ошибка (неверный ID или владелец) Портит: AF, DE, HL Описание: функция #3E ? освободить блок памяти. ████████████████████████████████████████████████████████████████████ RmDir.asm ████████████████████████████████████████████████████████████████████ RMDIR: Вход: HL = имя удаляемого каталога Выход: CF=0 каталог удалён, CF=1 ошибка Портит: AF, BC, DE, HL, IX, IY Описание: функция #1C ? удаление пустого каталога. ████████████████████████████████████████████████████████████████████ ScanDRV.asm ████████████████████████████████████████████████████████████████████ SCANDRV: Вход: нет Выход: A = количество логических дисков после рескана, если бут-диск пропал ? KERNEL_PANIC Портит: AF, BC, DE, HL Описание: функция #08 ? пересканировать устройства и обновить таблицы. ████████████████████████████████████████████████████████████████████ Scroll.asm ████████████████████████████████████████████████████████████████████ SCROLL: Вход: D = строка, E = столбец, H = высота, L = ширина, B = 1 (вверх) / 2 (вниз), A = 0 (очищать крайнюю строку) Выход: CF=0 выполнено, CF=1 ошибка (INVALID_FUNCTION) Портит: AF, BC, DE, HL, IX Описание: функция #55 ? прокрутка окна. ████████████████████████████████████████████████████████████████████ SelPage.asm ████████████████████████████████████████████████████████████████████ SELPAGE: Вход: B = страница экрана (0/1) Выход: CF=0 страница переключена, если текстовый режим, восстановлен Портит: AF, BC Описание: функция #54 ? выбор активной видеостраницы. ████████████████████████████████████████████████████████████████████ SetDateTime.asm ████████████████████████████████████████████████████████████████████ PUT_D_T: Вход: A = файловый манипулятор, D = день, E = месяц, IX = год, H = час, L = минуты, B = секунды Выход: CF=0 атрибуты файла обновлены (флаг изменения установлен), CF=1 ошибка Портит: AF, BC, DE, HL, IX Описание: функция #18 ? установить дату/время файла. ████████████████████████████████████████████████████████████████████ SetMem.asm ████████████████████████████████████████████████████████████████████ SETMEM: Вход: A = идентификатор блока, B = новый размер в страницах Выход: CF=0 размер изменён, CF=1 ошибка Портит: AF, BC, DE, HL Описание: функция #3F ? изменить размер блока памяти. .SIZEBLK (SETMEM): Вход: C = ID блока Выход: B = текущий размер в страницах, CF=0 Портит: AF, BC Описание: подсчёт текущего размера блока. ████████████████████████████████████████████████████████████████████ SetVMod.asm ████████████████████████████████████████████████████████████████████ SETVMOD: Вход: A = код режима (2,3,81h,82h), B = страница (0/1) Выход: CF=0 режим установлен, CF=1 ошибка Портит: AF, BC, DE, HL, IX, IY Описание: функция #50 ? установить видеорежим. SETVMOD.TEXT_M: Вход: A = текущий режим (используется из SELPAGE) Выход: текстовый режим восстановлен (окно открыто) Портит: AF, BC, DE, HL, IX Описание: переключение в текстовый режим без сохранения. SETMODE: Вход: HL = описатель окна, E = флаги окна Выход: окно открыто через BIOS Портит: AF, BC, DE, HL, IX Описание: открыть стандартное окно с автоподстановкой страницы. SAVETXT: Вход: нет Выход: текущий текстовый экран сохранён в TXTPAGE (BACKTXT) Портит: AF, BC, DE, HL, IX Описание: сохранить текстовый экран перед переходом в графику. BACKTXT: Вход: (BACKTXT.VMODE) ? был графический режим? Выход: если был, восстанавливает текстовый экран из TXTPAGE Портит: AF, BC, DE, HL, IX Описание: восстановить текстовый экран после графики. ████████████████████████████████████████████████████████████████████ SetWin.asm ████████████████████████████████████████████████████████████████████ SETWIN: Вход: A = ID блока, B = логическая страница, H = биты 6-7 задают слот (00->SLOT1, 40->SLOT2, 80->SLOT3) Выход: CF=0 -> A = предыдущая страница в слоте, CF=1 ошибка Портит: AF, BC, DE, HL Описание: функция #38 ? подключить страницу памяти в окно. SETWIN1: Вход: A = ID блока, B = страница Выход: аналогично SETWIN (всегда SLOT1) Портит: AF, BC, DE, HL Описание: функция #39 ? подключить страницу в слот 1. SETWIN2: Аналогично для SLOT2 (функция #3A). SETWIN3: Аналогично для SLOT3 (функция #3B). SETWIN.ALL: Общая часть: получение физической страницы через BIOS.GetMemPage и переключение слота. ████████████████████████████████████████████████████████████████████ Time.asm ████████████████████████████████████████████████████████████████████ SYSTIME: Вход: нет Выход: D = день, E = месяц, IX = год, H = час, L = минуты, B = секунды, C = день недели Портит: AF, BC, DE, HL, IX Описание: функция #21 ? получить системную дату/время. SETTIME: Вход: D = день, E = месяц, IX = год, H = час, L = минуты, B = секунды Выход: CF=0 время установлено, CF=1 ошибка Портит: AF, BC, DE, HL, IX Описание: функция #22 ? установить системную дату/время. ████████████████████████████████████████████████████████████████████ Version.asm ████████████████████████████████████████████████████████████████████ VERSION: Вход: нет Выход: DE = версия (VERS*256+MODF), BC = билд (BUILD), HL = 0 Портит: HL, DE, BC Описание: функция #00 ? версия DOS. ████████████████████████████████████████████████████████████████████ WinCopy.asm ████████████████████████████████████████████████████████████████████ WINCOPY: Вход: D = строка, E = столбец, H = высота, L = ширина, B = страница буфера (если IX >= #C000), IX = адрес буфера Выход: область экрана сохранена в буфер Портит: AF (состояние прерываний) Описание: функция #59 ? сохранить окно экрана. ████████████████████████████████████████████████████████████████████ WinRest.asm ████████████████████████████████████████████████████████████████████ WINREST: Аналогично WINCOPY, восстановление из буфера (функция #5A). ████████████████████████████████████████████████████████████████████ WrChar.asm ████████████████████████████████████████████████████████████████████ WRCHAR: Вход: D = строка, E = столбец, A = символ, B = атрибут Выход: символ выведен на экран (без изменения знакоместа?) Портит: AF (параметры в BIOS.WIN_PUT_SYM.NoChangeZG) Описание: функция #58 ? вывести символ в заданную позицию. ████████████████████████████████████████████████████████████████████ Write.asm ████████████████████████████████████████████████████████████████████ WRITE: Вход: HL = адрес данных, DE = размер, A = файловый манипулятор Выход: CF=0 данные записаны (размер файла обновлён), CF=1 ошибка Портит: AF, BC, DE, HL, IX, IY (и теневые) Описание: функция #14 ? запись в файл. WRITE.Start: Вход: как WRITE Выход: CF=0 запись выполнена, CF=1 ошибка Портит: практически всё Описание: основная логика записи (блочная, с обработкой остатков). WRITE.ERR1, WRITE.ERR2, WRITE.ERR3, WRITE.RD_ONLY: Точки выхода при ошибках, не отдельные процедуры, а метки для восстановления стека. ████████████████████████████████████████████████████████████████████