mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-08-05 01:34:39 +03:00
56 lines
4.0 KiB
Markdown
56 lines
4.0 KiB
Markdown
# 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`
|
||
при несовпадении, где `WorkDirectory` ⊋ `CurrentDirectory` (спуск в
|
||
подкаталог), 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`) заменить на:
|
||
|
||
```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`
|
||
(строки 262–266) — применено (`JR NZ,.gotoPath` сразу после `CALL .checkDrive`).
|