# 02 — Протокол шины (Bus Protocol) Между **IOC ↔ CMC ↔ MMC** обмен идёт по **сигнальным проводам** (пины MicroLua). Сообщения — короткие UTF-8 строки в формате: ``` OP|ARG1|ARG2|...|ARGn ``` Где: - `OP` — опкод (ASCII, регистрозависимый). - `ARG*` — аргументы, экранированные по правилу ниже. - Разделитель — `|` (pipe). Внутри аргументов `|` и `\` экранируются как `\|` и `\\`. - Строка не должна превышать разумный лимит; контроллеры сами усекают при ошибках. ## 1. Направления и пины шины | Шина | Контроллеры | Выделенные пины CMC | Назначение | |---|---|---|---| | **CMD** | IOC ↔ CMC | `in_cmd`, `out_cmd` | ввод команд и вывод текста | | **MEM** | CMC ↔ MMC | `in_mem`, `out_mem` | запросы ФС и ответы | | **SEG** | MMC ↔ SEG* | `WE[i]`, `RD[i]`, `DATA` | прямой доступ к сегментам | ## 2. Опкоды CMD (терминал) | Опкод | Направление | Аргументы | Описание | |---|---|---|---| | `OUT` | CMC → IOC | `text` | вывести текст на терминал | | `CLR` | CMC → IOC | — | очистить экран (`out[2]=1`) | | `COL` | CMC → IOC | `R,G,B` | установить текущий цвет | | `IN` | IOC → CMC | `line` | пользователь ввёл строку | ## 3. Опкоды MEM (файловая система) | Опкод | Направление | Аргументы | Ответ | Описание | |---|---|---|---|---| | `STAT` | CMC → MMC | `path` | `inode\|mode\|uid\|gid\|size` | метаданные файла | | `READ` | CMC → MMC | `path\|offset\|len` | `data` (Base64) | чтение фрагмента | | `WRITE` | CMC → MMC | `path\|offset\|data` | `OK\|bytes` или `ERR\|code` | запись | | `LS` | CMC → MMC | `dir` | `name1\|inode1\|...` | список записей каталога | | `CHDIR` | CMC → MMC | `path` | `OK\|newcwd` или `ERR` | смена cwd (проверка прав) | Коды ошибок: `EACCES`, `ENOENT`, `EEXIST`, `ENOSPC`, `EINVAL`. ## 4. Прямой доступ SEG (MMC ↔ SEG) MMC управляет сегментами напрямую по линиям `WE[i]`, `RD[i]`, `DATA`. Формат сообщений SEG-уровня — внутренний (не по шине), но общий принцип: ``` write_enable(i): DATA <- encoded_block; pulse WE[i] read(i): pulse RD[i]; receive DATA ``` CMC никогда не касается SEG напрямую — только через MMC. ## 5. Тайминги и подтверждения - Каждый запрос шины требует **подтверждения** (ответ `OK`/`ERR`) в течение разумного числа кадров. - CMC может выполнять до **одного активного запроса** на шину одновременно (сериализация). - При отсутствии ответа — таймаут и ошибка `ETIMEDOUT`. ## 6. Сериализация и безопасность - Все строковые данные экранируются: `|` → `\|`, `\` → `\\`. - Base64 (или BMP-упаковка) гарантирует, что сжатые данные не содержат управляющих символов. - Проверяйте длину: при превышении 4096 символов — ошибка. Подробности форматов inode, блоков и сжатия — в `03-memory-model.md` и `04-filesystem.md`.