sv512_advance/lv512_advance hardcoded the post-wrap offset to exactly #4000, discarding whatever the add overshot #8000 by. Invisible for page-aligned transfers, but create_filename's ".EXT"-marker handling (strips a leading 4-byte ".TRD"/".SCL"/etc marker some archive downloads carry) starts thread.adress a few bytes past #4000, so the reset silently dropped that offset on the first page wrap only, splicing 4 stray bytes into the saved file and losing its real last 4 bytes. Fixed by subtracting #40 from H instead of resetting it (CP doesn't touch A, so this costs zero extra bytes). Confirmed via a direct RAM-vs-disk MD5 comparison on a 640KB, 40-page-boundary download: byte-for-byte identical after the fix.
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).