Replace closed WDFCVBI2.COD with from-scratch open SD/FAT32 driver
Renamed as zc_sd_driver.asm/zc_sd_driver_body.asm (no relation to Wild Commander). Fixes a stale-IX bug where core_mkfile's filter_name_to_83 left IX pointing into driver memory instead of restoring it, causing zifi.asm's save_downloaded_file to read the wrong page/address for every SAVE512 call after MKFILE. All CORE dispatch entry points now preserve IX across the call. Also fixes a body/#2000 jump-table overlap, sdbuf DMA word-alignment, and a load_ram_page staleness race in zifi.asm's own download bookkeeping.
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
# zc_sd_driver
|
||||
|
||||
Открытый SD/FAT32-драйвер для ZiFi, замена закрытого `WDFCVBI2.COD`.
|
||||
Реализует ту же CORE-таблицу (`CORE equ #2002` в `zifi.asm`), что и
|
||||
оригинальный драйвер, но с открытыми исходниками.
|
||||
|
||||
## Файлы
|
||||
|
||||
- `zc_sd_driver.asm` — резидентная часть: таблица переходов CORE,
|
||||
di/ei-обёртки над каждой точкой входа, распаковщик тела.
|
||||
- `zc_sd_driver_body.asm` — основная логика: SPI/SD-протокол, DMA,
|
||||
разбор FAT32 (BPB, цепочки кластеров, FAT), поиск по имени с LFN,
|
||||
создание/удаление файлов и каталогов. Хранится в сжатом виде и
|
||||
распаковывается в резидентную часть во время выполнения `DOS_SWP`.
|
||||
- `body_syms.inc` — адреса функций/переменных тела, сгенерированные
|
||||
из символьной таблицы сборки `zc_sd_driver_body.asm`, подключаются
|
||||
в `zc_sd_driver.asm` как константы.
|
||||
|
||||
## Реализованные функции CORE
|
||||
|
||||
`DEV_INI`, `HDD`, `LOAD512`, `SAVE512`, `DOS_SWP`, `MKFILE`, `MKDIR`,
|
||||
`DELFL`, `RENAME`, `FENTRY`, `LOADNON`, `NXTETY`, `SETDIR`, `SETROOT`,
|
||||
`SEEK0`. Остальные точки входа таблицы — заглушки (не используются
|
||||
ZiFi).
|
||||
|
||||
## Адресация
|
||||
|
||||
Драйвер загружается в физическую страницу `#0F`, отображается в CPU
|
||||
слот 0 (`#0000-#3FFF`). `CORE` (`#2002`) — фиксированный адрес внутри
|
||||
этого слота. Резидентная часть собирается с `ORG #2000`; тело
|
||||
распаковывается в адреса `#0000..body_end` той же страницы —
|
||||
`body_end` обязан оставаться в пределах `#2002` (граница проверяется
|
||||
на этапе сборки).
|
||||
|
||||
`LOAD512`/`SAVE512` используют прямой DMA между SD-картой и указанной
|
||||
вызывающим физической страницей/смещением, не затрагивая пейджинг
|
||||
CPU.
|
||||
|
||||
## Сборка
|
||||
|
||||
```
|
||||
cd _sd
|
||||
sjasmplus.exe zc_sd_driver_body.asm --sym=body_syms_new.txt
|
||||
# упаковать zc_sd_driver_body.bin -> zc_sd_driver_body.pb (PackBits)
|
||||
# обновить body_syms.inc из body_syms_new.txt (без DATA/CONF)
|
||||
sjasmplus.exe zc_sd_driver.asm
|
||||
```
|
||||
|
||||
Результат (`zc_sd_driver.bin`) копируется в `_spg/` и подключается
|
||||
через `_spg/spgbld.ini` (`Block = #e000, #0f, zc_sd_driver.bin`).
|
||||
Reference in New Issue
Block a user