Estex-DSS/AGENT_TODO.MD
2026-07-20 16:38:16 +10:00

4.0 KiB
Raw Blame History

AGENT_TODO.MD — советы от ИИ-агента к рассмотрению

Копилка предложений от ИИ-агентов. По команде «сохрани совет» агент добавляет сюда новый раздел со сквозным номером. Нумерация не переиспользуется.


Совет #1. DIR_PATH_CHECK.gotoPath: заменить трюк с CHECK_SLASH на JP CHDIR

Статус: на рассмотрении (2026-07-19 применён другой вариант фикса — см. ниже)

Контекст. Баг: из C:\PASCAL после Open("SUB\A.TXT") любой следующий вызов с относительным путём (Create, Open, ChDir) резолвил путь от корня диска и падал с #04 PATH_NOT_FOUND. Причина: в DIR_PATH_CHECK.checkDir при несовпадении, где WorkDirectoryCurrentDirectory (спуск в подкаталог), HL входил в .gotoPath уже ЗА терминатором CurrentDirectory, и FINDDIR.CHECK_SLASH дописывал \ после терминатора, а не вместо него. SetPath_GetName(CurrentPath) видел C:\PASCAL без завершающего \, выполнял только reroot через CHDISK и не доходил до CWD, возвращая CF=0.

Применённый вариант (в рабочем дереве): перенос INC DE/INC HL после JR NZ,.gotoPath — HL остаётся на символе несовпадения (в случае-префиксе это сам терминатор), CHECK_SLASH находит конец строки за одну итерацию CPIR. Нулевая дельта по размеру и тактам, основной баг устраняет.

Предлагаемый альтернативный вариант: весь блок .gotoPath (DSS/DOS_FS.ASM) заменить на:

.gotoPath:	LD	HL,CORE_BUFFERS.CurrentPath
		JP	CHDIR

CHDIR (DSS/API/ChDir.asm) уже реализует ровно нужную семантику «пройти путь, включая последний компонент»: SetPath_GetName + OPENDIR(TMPNAME). Трюк «дописать \ → пройти путь → стереть \» становится ненужен.

Плюсы относительно применённого варианта:

  • ~20 байт → 6 байт (14 байт); нет вызова CHECK_SLASH/CPIR вовсе — экономия тактов на любом входе, а не только на баг-кейсе;
  • уходит зависимость .gotoPath от входящих HL/BC/AF' (на входе со смены диска BC собирается из неинициализированного AF');
  • уходит косяк с затиранием корня: в применённом варианте при CurrentDirectory="\" и спуске в подкаталог epilogue DEC HL/LD (HL),0 превращает CurrentDirectory в "" (косметика: API #1E CURRDIR_FN вернёт пустую строку вместо "\", самолечится следующим ChDir; в старом коде тот же эффект был на входе со смены диска при CWD=корень).

Минусы/риски: большее семантическое изменение — ошибки возвращают SetPath_GetName/OPENDIR напрямую, отдельный LD A,PATH_NOT_FOUND после CHECK_SLASH удаляется; требуется прогон на эмуляторе/железе.

Связанное: удаление дублирующего сравнения диска в .forceCheck (строки 262266) — применено (JR NZ,.gotoPath сразу после CALL .checkDrive).