Files
ZiFi/README.md
T
alex c3c5c7dccc 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.
2026-09-09 20:50:06 +03:00

59 lines
9.5 KiB
Markdown

![ZiFi](http://zifi.vtrd.in/logo.png "ZiFi")
**#ZiFi - Internet client for ZX Evolution with TS Conf**
About project (ru): [ZiFi homepage ](http://zifi.vtrd.in), [ZiFi или интернет для Z80 ](http://hype.retroscene.org/blog/dev/363.html),
[ZiFi v. 0.61 released! ](http://hype.retroscene.org/blog/dev/391.html)
**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
![ZiFi splash](http://hype.retroscene.org/uploads/images/00/00/14/2016/04/15/475aec.png "ZiFi splash")
_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 символов нет.
**Заменил драйвер SD-карты.** Штатный `_sd/WDFCVBI2.COD` (закрытый бинарник без исходников, автор — "Hacker VBI") был заменён на собственный, открытый SD/FAT32-драйвер (`_sd/zc_sd_driver.asm` + `_sd/zc_sd_driver_body.asm`) — реализует те же ~15 функций CORE-таблицы, которые реально использует ZiFi. Заодно исправлена и порча имён папок на FAT32 (короткие имена 8.3 иногда совпадали с уже существующей записью в каталоге). Подробнее — `_sd/README.md`.
**Известная нерешённая мелочь:** курсор мыши (аппаратный спрайт TSU) обрывается по фиксированной строке экрана прямо над нижней панелью управления — похоже на границу, завязанную на тайминг переключения видеорежима или на аппаратный бордюр, а не на что-то, что двигается вместе с содержимым панели. Я не нашёл способ поправить это без риска сломать что-то ещё, оставил как есть.