From c1349fbe050f9bb28a8ca568aa0d7a199ba737f7 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 5 May 2026 22:32:21 +1000 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=98=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83?= =?UTF-8?q?=D1=80=20=D0=B2=20TXT.=20=D0=98=D0=98=20known.bug=20=D0=9C?= =?UTF-8?q?=D0=BE=D0=B3=D1=83=D1=82=20=D0=B1=D1=8B=D1=82=D1=8C=20=D0=B3?= =?UTF-8?q?=D0=BB=D1=8E=D0=BA=D0=B8=20=D0=B2=20=D1=82=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D1=82=D0=B5.=20=D0=9C=D0=B5=D0=BB=D0=BE=D1=87=D1=8C=20=D0=B2?= =?UTF-8?q?=D1=81=D1=8F=D0=BA=D0=B0=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Ex_Path.asm | 7 +- DSS/KNOWN.BUG | 101 ++- DSS/deepseek_text.txt | 1853 +++++++++++++++++++++++++++++++++++++++++ SHELL/BATCH.ASM | 2 +- Shared_Includes | 2 +- 5 files changed, 1960 insertions(+), 5 deletions(-) create mode 100644 DSS/deepseek_text.txt diff --git a/DSS/API/Ex_Path.asm b/DSS/API/Ex_Path.asm index aab7a8b..512bef0 100644 --- a/DSS/API/Ex_Path.asm +++ b/DSS/API/Ex_Path.asm @@ -155,6 +155,7 @@ EX_PATH: EXX .NAME_YEP: LD A,2 CP C JR Z,.NOFNAME + ; PUSH HL LD HL,TMPBUF LD DE,(NM_NAME) ; адрес буфера под имя файла @@ -200,7 +201,8 @@ EX_PATH: EXX PUSH HL LD HL,TMPBUF LD DE,(NM_DRIVE) - LD B,0 + ; A=0 + LD B,A LDIR POP HL EX AF,AF' @@ -219,7 +221,8 @@ EX_PATH: EXX EX DE,HL LD HL,TMPBUF ; 12 пробелов POP BC - LD B,0 + ; A=0 + LD B,A LDIR POP HL EX AF,AF' diff --git a/DSS/KNOWN.BUG b/DSS/KNOWN.BUG index e5f3ea4..f944d5e 100644 --- a/DSS/KNOWN.BUG +++ b/DSS/KNOWN.BUG @@ -7,7 +7,106 @@ FIXED: + ошибка при просмотре каталога в функциях установки атрибутов пропускаются системные файлы. п/п SEARCH MASK=#23 -- игнорирование ошибок при записи системных областей FAT/DIR, невозможность отработать ошибку write-protect, так как она теряется при попытке записать измененный каталог на диск. Но возникает ошибка file not found так как сразу после создания система открывает файл. +- игнорирование ошибок при записи системных областей FAT/DIR, невозможность отработать ошибку write-protect, + так как она теряется при попытке записать измененный каталог на диск. Но возникает ошибка file not found + так как сразу после создания система открывает файл. - ошибка разбора допустимого имени файла, если оно состоит из "." так как подразумевается пробелы точка пробелы. +======================================================= AI ======================================================= +1.1. CREATE (Create.asm) ? Осиротевшая запись каталога при сбое открытия + - После создания записи каталога (WRT_HND, SAVEDIR) вызывается + OPEN_FN.FILE. Если открытие файла не удаётся (например, нет + свободных манипуляторов, ошибка диска), в каталоге остаётся + файловая запись с нулевым размером и без данных. Последующие + попытки создать файл с тем же именем приведут к ошибке + FILE_EXISTS, хотя файл фактически пуст и не открыт. + - Исправление: если OPEN_FN.FILE возвращает ошибку, нужно удалить + только что созданную запись вызовом DELETE_REC_FAT. + +1.2. ATTRIB (Attribute.asm) ? Некорректный режим открытия для записи атрибутов + - При установке атрибута (B=1) вызывается .OPENATR, которая + открывает файл с режимом по умолчанию (A=0 ? чтение/запись). + Если файл уже открыт другим процессом на запись, операция может + завершиться ошибкой или нарушить блокировки. Не проверяется + текущий режим доступа. + - Исправление: открывать файл с режимом 0 (чтение/запись) только + если он не был открыт ранее; при необходимости использовать + отдельный запрос блокировки. + +1.3. LEAV (Execute.ASM) ? Отсутствие проверки SP в EXE-заголовке + - При запуске EXE-файла значение SP_REG из заголовка загружается + в SP без проверок. Некорректное значение (например, 0x0000) + приведёт к немедленному краху стека. Желательно проверять, + попадает ли SP в допустимый диапазон памяти задачи, и + устанавливать безопасное значение при ошибке. + +1.4. Read (Read.asm) ? Несбалансированный стек на пути ошибки + Утверждение из первоначального анализа оказалось неверным ? после + трёх PUSH (BC,HL,DE) выполняются три POP (HL,HL,BC), стек + балансируется. Однако DE остаётся испорченным, что допустимо по + соглашению. Проблемы со стеком нет. + + Тем не менее, в этом же модуле есть другой потенциальный дефект: + в .ROV1 при успешном чтении используется EXX и модификация стека + в альтернативных регистрах, что может привести к путанице, если + где-то не сохранены вторичные регистры. Рекомендуется тщательно + проверять использование EXX в обработчиках ошибок. + +1.5. ENV_EX (Environ.asm) ? Игнорирование ошибки переполнения буфера + - Функция ENV_EX может установить CF=1, если входная строка + окружения слишком длинная, но вызывающие её процедуры GETENV + и SETENV никак не анализируют этот флаг. Переменная создаётся + или читается с обрезанным значением без предупреждения, что + может привести к трудноуловимым ошибкам конфигурации. + - Исправление: добавить проверку CF после вызова ENV_EX и + возвращать ошибку ENV_ITEM_OVERFLOW. + +1.6. diskINF GetFreeSpace (diskINF.asm) ? Возможное зависание при + повреждённой FAT + - Цикл подсчёта свободных кластеров проверяет READ_FROM_FAT, + но не ограничивает число итераций. Если цепочка кластеров + замкнута или таблица FAT испорчена, цикл может стать бесконечным. + - Исправление: добавить счётчик итераций, равный общему числу + кластеров, или использовать аппаратный тайм-аут. + + +================================================================ +2. ПРЕДЛОЖЕНИЯ ПО ОПТИМИЗАЦИИ +================================================================ + +2.2. Кэширование каталога + - Многие функции (OPEN, DELETE, RENAME) многократно загружают + один и тот же каталог через LOADDIR. Можно проверять, не + совпадает ли текущий открытый каталог с FM_BUF[0], и избегать + повторного чтения. + + +2.5. Оптимизация WRITE_FAT_TABLE + - При записи кэша FAT на диск проверяется значение CacheUpdated, + и записываются только изменённые блоки. Однако при + последовательной записи многих кластеров часто вызывается + WRITE_FAT_TABLE. Можно отложить запись до закрытия файла или + накопить изменения. + +2.6. Избегание повторного чтения BPB + - В OPENDSK каждый раз вызывается RD_BPB, даже если диск уже + открыт с теми же параметрами. Можно добавить поле в FS_Buffer, + сигнализирующее, что BPB корректен, и пропускать повторное + чтение при отсутствии смены диска. + +================================================================ +3. ОБЩИЕ ЗАМЕЧАНИЯ +================================================================ + +3.3. Отсутствие проверок границ буферов + - В ряде процедур (например, EXEC Build PSP, Environ) используются + фиксированные константы размера буфера (#100, #80). Желательно + проверять, что данные не выходят за границы выделенной памяти. + +3.4. Устаревший код + - В файлах присутствуют закомментированные старые реализации + (например, старый ECHOKEY с курсором, старый PUTCHAR). Их + удаление уменьшит объём исходного текста и улучшит читаемость. + +================================================================ \ No newline at end of file diff --git a/DSS/deepseek_text.txt b/DSS/deepseek_text.txt new file mode 100644 index 0000000..1f15737 --- /dev/null +++ b/DSS/deepseek_text.txt @@ -0,0 +1,1853 @@ +Список процедур проекта сгенерированный ИИ. +Метки, не начинающиеся с точки (и некоторые значимые локальные метки, +используемые как точки входа), с описанием входов/выходов/портящихся +регистров на основе анализа кода. + +Структура: +ИмяПроцедуры + Вход: список регистров/условий + Выход: список регистров/флагов + Портит: разрушаемые регистры (кроме явно указанных в Выходе) + +Файлы сгруппированы по принадлежности. + +████████████████████████████████████████████████████████████████████ +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: + Точки выхода при ошибках, не отдельные процедуры, а метки для восстановления стека. + +████████████████████████████████████████████████████████████████████ \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index c59c74a..ef347f4 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -42,7 +42,7 @@ MAKE_BATCH_PRM_ARRAY: ret z cp " " jr z,.loop - cp 9 ; Tab + cp "\t" ; Tab jr z,.loop ex de,hl ld (hl),e diff --git a/Shared_Includes b/Shared_Includes index e9eb5c7..cb54ddb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e9eb5c7c06a16b07f348992ee8ba3557cf5884c2 +Subproject commit cb54ddb2079648878b113592fe33e370741b0471