The closed WDFCVBI2.COD driver's short-name generator can assign the same 8.3 name to two different long-name directory entries, corrupting the FAT directory structure (confirmed live on hardware via chkdsk: 2026_09_01 and 2026_0~1.--0 are the same day, split across two colliding entries). Since the driver ships as a binary with no source, documented the issue in README and started writing an open replacement SD/FAT32 driver from scratch. This commit adds the in-progress diagnostic scaffolding for that new driver (test_sd_raw/test_sd_raw2 in zifi.asm, marked with ;DIAG: comments): a standalone SD-card SPI implementation (ports CONF=#77/ DATA=#57) that inits the card, reads sectors via CMD18+CMD12, and parses the FAT32 boot sector/root directory independently of the closed driver. Still under active debugging - the command handshake (R1/token) checks out correct but the bulk data payload comes back wrong, root cause not yet found. Not wired into the real boot path beyond the diagnostic hook, and not ready to replace the closed driver.
10 KiB
#ZiFi - Internet client for ZX Evolution with TS Conf
About project (ru): ZiFi homepage , ZiFi или интернет для Z80 , ZiFi v. 0.61 released!
Work with sites: vtrdos, zxart, prods.tslabs, hype, pouet, irclogs;
Download: games, system progs, demopack disk's, diskmag's;
See: zx spectrum screens;
Listen: Ay8910 chip music
Work with cable socket driver by PSB and Wifi module ESP8266, driver by DDp / Hacker VBI
For Z80 CPU
Доработки в этой сборке (2026)
Оригинальный проект давно не поддерживается автором, поэтому часть функций я переделал под текущее состояние сети и сервисов.
Убрал проверку обновлений по HTTP. Раньше при загрузке клиент ходил на zifi_ver.php, проверял версию, при необходимости скачивал новый клиент и сверял CRC16. Сервер обновлений больше не обновляется — всю эту ветку (autoupdate, CRC16, скачивание .spg) я убрал из zifi.asm.
Перевёл синхронизацию времени на стандартные AT-команды SNTP. Использую штатный протокол ESP-AT — он есть в том числе в обычной прошивке для ESP-01/ESP8266:
AT+CIPSNTPCFG=1,0,"pool.ntp.org" — включить SNTP, UTC, публичный сервер
AT+CIPSNTPTIME? — получить текущее время
Ответ (+CIPSNTPTIME:Www Mmm dd hh:mm:ss yyyy) я разбираю прямо на Z80 — с учётом того, что синхронизация происходит в фоне и первые секунды может отдавать заглушку 1970 года (в этом случае клиент подождёт и переспросит, с ограничением по числу попыток, чтобы не подвесить загрузку насовсем).
Часовой пояс по-прежнему берётся из zifi.ini (time: +N / time: -N / time: none) и применяется на стороне Z80 поверх времени UTC от SNTP.
Заодно добавил запись секунд и дня недели (0 = воскресенье) в RTC (DS1685) — раньше эти два поля не заполнялись вообще.
Добавил поддержку HTTPS. Часть сайтов в списках загрузок (prods.tslabs.info, bbb.retroscene.org) перестала пускать по обычному http и принудительно перенаправляет на https. Клиент теперь сам определяет схему ссылки и выбирает AT+CIPSTART="TCP",...,80 или AT+CIPSTART="SSL",...,443 — это касается и ссылок из меню, и ссылок, которые сервер присылает внутри списков файлов.
Добавил сообщение о готовности. После завершения всех этапов загрузки (подключение к Wi-Fi, синхронизация времени, папка загрузок) на экране появляется "ZiFi is ready." — раньше было не всегда понятно, можно ли уже пользоваться меню.
Убрал мигание вертикальных полос при воспроизведении музыки. Индикатор громкости AY-каналов (music_analizator) раньше рисовался прямо внутри прерывания, которое отвечает за точное по строкам переключение видеорежима текст/графика — и делал это вместе с DMA-очисткой экрана и переключением страниц памяти. На динамичных треках (больше эффектов — дольше выполняется код) это сбивало тайминг прерывания и давало заметные мигающие полосы на экране. Я вынес отрисовку индикатора из прерывания в обычный код главного цикла (раз в кадр, синхронно с wait_frame, но уже не в раст-критичной цепочке) — сам плеер и его тайминг (темп, высота нот) не тронул.
Поправил позицию нижней панели управления. Она была смещена на пару пикселей вниз относительно верхней панели с самого начала (не моя регрессия) — поправил смещение GYOFFSL в int_text_off.
Добавил таймаут загрузки с автоматическими повторами. Раньше при зависшем/неотвечающем сайте клиент мог ждать данные бесконечно — выйти можно было только вручную нажав крестик отмены. Теперь если от сервера ~10 секунд вообще нет никаких данных (интервал считается по кадрам экрана, 50Гц, не зависит от частоты процессора/турборежима), запрос повторяется — до 3 раз. Если и это не помогло — для музыки клиент переходит к следующему треку в списке (со своим лимитом на подряд неудачные треки, чтобы не крутиться по всему плейлисту вечно, если сети вообще нет), для остального — обычная отмена, как раньше по крестику.
Мелкие исправления:
- перевёл обращение к порту
#EFF7(общий системный регистр — управляет не только доступом к часам, но и видеорежимом/turbo/кэшем) на read-modify-write вместо прямой перезаписи всего байта, чтобы не сбивать остальные настройки; - исправил баг в разборе двузначного GMT-смещения из
zifi.ini(например+10) — были перепутаны местами разряды; - теперь DMA-очистка под индикатор громкости дожидается завершения перед тем, как CPU начинает рисовать поверх той же области (была гонка записи);
- исправил переполнение буфера имени файла (
create_filename): при скачивании имя файла из ссылки копировалось в 48-байтный буфер без проверки длины, и если оно было длиннее — переполнение затирало соседние переменные (zifi.ini, имена служебных папок) прямо в памяти. Теперь копирование корректно обрезается на 48 символах. Проверено на железе: создание папки и файла с длинными именами (в т.ч. ровно 48 символов) и последующее чтение содержимого — всё работает штатно, никакой драйверной обрезки до 8 символов нет.
Известная серьёзная проблема (пока не исправлена): порча имён папок на FAT32. Штатный драйвер SD-карты (_sd/WDFCVBI2.COD, закрытый бинарник без исходников, автор — "Hacker VBI") при создании папки/файла с длинным именем иногда генерирует короткое имя 8.3, совпадающее с уже существующей записью в каталоге — получаются две разные папки с одинаковым коротким именем на диске. Windows chkdsk потом это обнаруживает и переименовывает вторую запись в <имя>.--N, а по факту это два разных физических каталога, которые должны были быть одним (например, файлы за один день оказываются раскиданы между 2026_09_01 и 2026_0~1.--0). Нашёл и подтвердил дизассемблированием конкретный баг в алгоритме генерации числового суффикса ~N внутри драйвера, но исправить сам драйвер нельзя — исходников нет, только бинарник. Сейчас пишу отдельный, открытый SD/FAT32-драйвер на замену (реализует только те ~15 функций, которые реально использует ZiFi) — работа в процессе, ещё не готово к использованию.
Известная нерешённая мелочь: курсор мыши (аппаратный спрайт TSU) обрывается по фиксированной строке экрана прямо над нижней панелью управления — похоже на границу, завязанную на тайминг переключения видеорежима или на аппаратный бордюр, а не на что-то, что двигается вместе с содержимым панели. Я не нашёл способ поправить это без риска сломать что-то ещё, оставил как есть.

