16 KiB
AGENTS.md — Estex DSS
Документ для ИИ-агентов, работающих с этим репозиторием. Описывает устройство проекта, сборку, соглашения и подводные камни. Всё нижесказанное проверено по содержимому репозитория.
1. Обзор проекта
Estex DSS — доработка дисковой операционной системы DSS (Disk SubSystem) для компьютера Sprinter 2000 (SP2000) — российского ZX Spectrum-совместимого компьютера фирмы Peters Plus на процессоре Z84C15 (Z80-совместимый, со встроенным SIO/CTC). Исходный код унаследован от оригинальной DSS от Peters Plus (автор DNS — Denis Parinov, 1998–2003) и развивается дальше (правки BAO и др., актуальная версия — DSS 1.71.x).
Весь код — Z80-ассемблер для sjasmplus. Комментарии и документация — на
русском языке. Загрузочная цепочка: BIOS (≥3.06) → boot-сектор
(DSSloader.bin) → ядро SYSTEM.DOS → командный интерпретатор SYSTEM.EXE.
Проект собирает три системных файла:
| Файл | Источник | Назначение |
|---|---|---|
SYSTEM.DOS |
DSS/DSS-MAIN.ASM |
Ядро DSS (API, файловые системы, драйверы) |
SYSTEM.EXE |
SHELL/SHELL.ASM |
Командный интерпретатор (шелл) |
SYS.EXE |
BOOT/boot.asm |
Установщик boot-загрузчика и системных файлов на диск |
DSSloader.bin |
BOOT/DSSBOOT.ASM |
Сам boot-загрузчик (секторный, ORG #8000) |
2. Структура репозитория
DSS/— ядро системы:DSS-MAIN.ASM— точка входа сборки ядра: RST-векторы, таблица функцийDSS_API_TABLE, карта буферовCORE_BUFFERS, подключает все модули черезINCLUDE.API.asm— агрегатор, включаетAPI/*.asm(~50 файлов — по одному системному вызову на файл:Open.asm,Read.asm,ChDir.asmи т.д.).DOS_FS.ASM— файловые/каталожные процедуры DOS-уровня.Procedures.asm— общие помощники (PUTCHAR,MK_TIMEи др.).KEYINTER.ASM— клавиатурный драйвер (PS/2-хост на SIO канала A Z84C15), обрабатывается в прерыванииRST 38.DRV-MAIN.ASM— страница драйверов (компилируется в отдельный блок черезDISP/ENTв концеDSS-MAIN.ASM), своя таблица RST по#A0000+.FS/— файловые системы:FS.ASM(диспетчер по сигнатуре#AA55),FAT.asm(FAT12/16/32),CDFS.ASM(CD, в разработке — веткаbeta_cdfs).drivers/— драйверы устройств:media/(ata_atapi-drv, fdd-drv, ram_disk-drv, ATAPI/CDX),Input/(MOUSE.ASM).first_init.asm— код первой инициализации (затирается после старта).defines.inc— compile-time флаги ядра (мышь, клавиатура, память и т.п.).VERSION.INC— версия ядра + Lua-логика номера билда.build.txt— счётчик билда ядра (одно число, сейчас 6).DSS_API.TXT— полное описание системных вызовов (UTF-8).DSS_MAP.TXT— карта памяти ядра;KNOWN.BUG,ToDo.txt,CHANGES.LOG— известные баги, планы, история изменений.
SHELL/— командный интерпретатор:SHELL.ASM— точка входа,EXEC.ASM— разбор и выполнение команд,BATCH.ASM— парсер .BAT (%VAR%, %0..%9, GOTO/IF),EDLINE.ASM— редактор строки с историей.Commands/— по файлу на команду: CD/CHDIR, CLS, DATE, DEL, DIR, ECHO, EXIT, GOTO, HELP, IF, INFO, MD/MKDIR, PATH, PAUSE, REM, REN, RD/RMDIR, SET, VER, REBOOT, BREAK.Procedures/— print, parsers, math, shared.Messages/main_txt.asm— тексты сообщений.version.inc,build.txt— версия и счётчик билда шелла.README.txt— описание команд и клавиш истории (CP866).
BOOT/—boot.asm(установщик →SYS.EXE),DSSBOOT.ASM(boot-сектор →Build/DSSloader.bin),README.TXT(CP866).Shared_Includes/— git-подмодуль (веткаmain, относительный URL../Shared_Includes.git, содержит собственный.git):constants/—SP2000.inc(порты/железо Sprinter),BIOS_equ.inc,dss_equ.inc(номера функций DSS),dss_errors.z80,EXE_Header.z80(512-байтный заголовок EXE), TRDOS/ZX-константы.structures/—FileSystem.inc,ATA_ATAPI.INC,bmp.inc.macroses/—macros.z80,accelerator.z80.LUA/Functions.lua— Lua-функции для sjasmplus (increase_build,get_build,Get_date_RU,Get_checksumи др.).Docs/— справочники:BIOS functions.asm,DSS_1.71_Functions.asm,sp2000.pdf, описание команд Z80.
Build/— выходы сборки (не отслеживается git,.gitignoreв проекте нет):DSS/{SYSTEM.DOS,SYSTEM.EXE,SYS.EXE}, листинги*.LST,Variables.inc(экспорт символов через--exp),Original/— оригинальные бинарники Peters Plus для сравнения,*_dasm.a80— дизассемблирования.Hidden/— архивные/справочные исходники (ATAPI, CDX); исключены из поиска VS Code (.vscode/settings.json→search.exclude).TMP_CODE.ASM— временный рабочий файл-черновик (не часть сборки).keys.md— детальный хендофф-документ по клавиатурной подсистеме (KEYINTER.ASM) для ИИ-сессий; полезен как образец глубокого разбора.
3. Сборка
Ассемблер: sjasmplus (проверено: установлен в
/c/tools/msys64/usr/local/bin/sjasmplus). Makefile нет — сборка идёт через
задачи VS Code (.vscode/tasks.json) или вручную теми же командами.
Ключевые флаги: --syntax=afw --fullpath -Wno-shortblock.
Ядро (задача «Build SYSTEM.DOS», проверено — собирается, 0 ошибок):
sjasmplus --nologo --syntax=afw --fullpath --color=on -Wno-shortblock \
--lst=Build/DSS-MAIN.LST --raw=Build/DSS/SYSTEM.DOS \
--exp=Build/Variables.inc dss/dss-main.asm
Задача «Build NEW VERSION of SYSTEM.DOS» добавляет --define INCREASE_BUILD
— при этом Lua-код в DSS/VERSION.INC инкрементирует DSS/build.txt.
Шелл (задача «Build SYSTEM.EXE», проверено — собирается, 0 ошибок):
sjasmplus ... --raw=Build/DSS/SYSTEM.EXE SHELL/SHELL.ASM. Без
--define INCREASE_BUILD билд шелла не трогает SHELL/build.txt.
Установщик (задача «Build SYS.EXE», проверено — собирается, 0 ошибок):
sjasmplus ... --raw=Build/DSS/SYS.EXE boot/boot.asm.
Особенности сборки:
- Версия ядра:
VERS=1, MODF=71вDSS/VERSION.INC, билд изDSS/build.txt→ строка вида «DSS 1.71.6». - sjasmplus исполняет встроенные Lua-блоки (
LUA PASS1/LUA ALLPASS…ENDLUA,INCLUDELUA 'Shared_includes/lua/Functions.lua') — через них подставляются дата сборки и номер билда. - Пути в
INCLUDEотносительны корню репозитория — запускать сборку нужно из корня (в задачахcwd = workspaceFolder). Регистр имён (dss/dss-main.asmvsDSS/DSS-MAIN.ASM) в задачах смешанный — на Windows это работает. - Включение файлов — текстовое (
INCLUDE): модули не компилируются отдельно, всё собирается одним проходом из главного файла. Активно используютсяMODULE/ENDMODULE,STRUCT/ENDS,DISP/ENT,ASSERT,DISPLAY(смотрите вывод сборки — там карта адресов буферов).
4. Архитектура рантайма
- Ядро собирается с
ORG 0и живёт на своей странице в слоте 0 (#0000–#3FFF); карта — вDSS/DSS_MAP.TXT. Вызов функций DSS из программ: номер функции в регистреC,RST 10h; ошибки возвращаются по флагуCF(код вA). Пример — в началеDSS/DSS_API.TXT. - RST-векторы ядра:
RST 00— возврат из процесса (RETFAR),RST 08— портал в BIOS,RST 10— DSS API,RST 18— портал на страницу драйверов,RST 20— FS API,RST 30— мышиный API,RST 38— обработчик IM1 (клавиатураKEYSCAN→ мышь → курсор). - Диспетчер
RST_10индексируетDSS_API_TABLE(адреса функций хранятся раздельными байтами: младшие и старшие — двумя блоками). - Драйверы (
DRV-MAIN.ASM) собираются в отдельный блок в конце образа ядра (черезDISP 0 … ENT) и работают на собственной странице; переход между страницами — через порталы RST иPORTAL.*. - Формат исполняемых файлов Estex — EXE с 512-байтным заголовком
(
Shared_Includes/constants/EXE_Header.z80: сигнатура'EXE', версия, адреса загрузки/старта/стека). Шелл собирается сDEFINE App_EXE_Version 1. - Многозадачность: процессы с IX-контекстом, номер таски в
(ix-1); подробности — вDSS_API.TXT(функции 41h EXEC, 47h APPINFO и др.). - Минимальная версия BIOS: 3.06 (
MINIMUM_BIOS_VERSIONвdefines.inc), проверяется вfirst_init.asm.
5. Соглашения по коду
- Кодировка: CP866 (русская DOS), переводы строк CRLF — у почти всех
.asm/.inc/.txt. Исключения в UTF-8:DSS/DSS_API.TXT,keys.md, этот файл. При чтении/поиске из Unix-окружения используйтеiconv -f CP866 -t UTF-8иgrep -a(grep может считать файлы бинарными). Не перекодируйте файлы — правьте их, сохраняя CP866+CRLF;git config core.autocrlf=true. - Отступы — табуляция; колонки:
метка: ОПЕРАЦИЯ операнды ; комментарий. Локальные метки — через точку (.loop), модули —MODULE/ENDMODULE. - В заголовках файлов — таблица изменений
Rev / Date / Name / Description(авторы: DNS, BAO и др.). При существенных правках добавляйте строку туда же в том же формате. - Маркеры задач в коде:
;!TODO,;!FIXIT,;!HARDCODE, чек-листы[ ]/[x]/[!](легенда — вDSS/ToDo.txt). - Compile-time конфигурация — только через
DEFINEвDSS/defines.inc(для ядра) и аналогичных*.inc; закомментированный define = выключено (см. комментарий в началеdefines.inc). - Новый системный вызов: файл
DSS/API/<Name>.asm+includeвDSS/API.asm+ слот вDSS_API_TABLE+ константа вShared_Includes/constants/dss_equ.inc+ описание вDSS/DSS_API.TXT. - Новая команда шелла: файл
SHELL/Commands/<CMD>.ASM+includeвSHELL/SHELL.ASM+ регистрация в парсере (EXEC.ASM/BATCH.ASM). - Коммит-сообщения — на русском, свободной формы; пометки вида
-bug,-bugfix,!FIXIT. Текущая ветка разработки —beta_cdfs.
6. Тестирование и отладка
Автоматических тестов в проекте нет. Проверка — ручная, на эмуляторе или реальном железе:
- Задача «Copy files to IMG» / «Copy THIS file to Test_2g.img»:
hdfmonkey putкопирует собранные файлы в HDD-образC:\tools\Progs\MAME\IMG\test_2g.img(илиsp_disk2.img). - Задача «Run MAME» запускает эмулятор через внешний
.bat(C:\tools\Progs\MAME\*.bat, сами скрипты вне репозитория). - Отладка: VS Code + DeZog (
.vscode/launch.json, remoteTypezsim), использует.sld-файлы sjasmplus; задача «Build this file» собирает текущий файл с--sldдля отладчика. - Дизассемблирование: задача «Disassemble binary» (
z80dasm). - Листинг
Build/DSS-MAIN.LST(~1 МБ) и выводDISPLAYпри сборке — основной способ контроля адресов/размеров. - При сборке с
--define INCREASE_BUILDменяются отслеживаемые git'ом файлы*/build.txt— не коммитьте случайные инкременты.
7. Безопасность и осторожность
- Код напрямую программирует железо (
OUTв системные порты, переключение страниц памяти, прерывания) — ошибка может подвесить систему только на целевой машине/эмуляторе, но не хост. hdfmonkey putмодифицирует файлы-образы дисков — убедитесь, что путь к образу верный, прежде чем запускать задачи копирования.BOOT/boot.asm(SYS.EXE) — программа записи boot-сектора на реальные FDD/HDD; на реальном железе это потенциально деструктивная операция.
8. Известные проблемы (на момент написания)
Сборка— исправлено 2026-07-18 (в рабочем дереве, правкаSYSTEM.EXEсломанаSHELL/version.incещё не закоммичена): задвоенные блоки (CONSOLE_VERS/CONSOLE_MODF/CONSOLE_BUILD, лишнийLUA ALLPASS) убраны,increase_buildвызывается только при--define INCREASE_BUILD. Проверено: шелл собирается с 0 ошибок,SHELL/build.txtне меняется. Исходная поломка была зафиксирована в коммите32dca48.- Актуальные списки багов и планов:
DSS/KNOWN.BUG(включая разбор багов от ИИ),DSS/ToDo.txt,DSS/CHANGES.LOG(секции!FIXIT/!TODO). - Ветка
beta_cdfs— работа над CDFS/BigDir в процессе («Пока не работает, надо доделывать BigDir» — коммит41ff458).