# Консоль и отладка --- ## TTY — PSF2 терминал **Файл**: `src/tty.rs` Шрифтовой терминал на основе PSF2 (PC Screen Font v2). Это **реально используемая консоль** в `kmain`. ### Psf2Header — `#[repr(C, packed)]` ```rust struct Psf2Header { magic: u32, // магическое число PSF2 version: u32, header_size: u32, flags: u32, num_glyphs: u32, // количество глифов bytes_per_glyph: u32, height: u32, // высота шрифта в пикселях width: u32, // ширина шрифта в пикселях } ``` ### Console ```rust pub struct Console<'a> { framebuffer: &'a Framebuffer<'a>, font: &'static [u8], // сырые данные PSF2 x: usize, // курсор X (в пикселях) y: usize, // курсор Y (в пикселях) fg_color: u32, // цвет текста (0xFFFFFF = белый) bg_color: u32, // цвет фона (0x000000 = чёрный) } ``` ### Методы | Метод | Описание | |---|---| | `new(framebuffer, font)` | Создаёт консоль, курсор в (0,0) | | `set_color(fg)` | Устанавливает цвет текста | | `clear()` | Зануляет фреймбуфер, сбрасывает курсор | | `header()` | Возвращает ссылку на Psf2Header | | `scroll()` | Сдвигает фреймбуфер на высоту шрифта, зануляет низ | | `draw_glyph(glyph_index, x, y)` | Рисует глиф: сканирует bitmap шрифта, пишет `fg_color` для установленных битов | | `write_char(c)` | Обрабатывает `\n`, word wrap, поиск глифа (0 для отсутствующих), скролл | | `write_str(s)` | Реализация `fmt::Write` — итерация по символам | `draw_glyph` — ключевой метод: строки шрифта — это побитовое представление, каждый бит — один пиксель. Если бит установлен → пишется `fg_color`, иначе пропускается. --- ## Serial — последовательный порт **Файл**: `src/debug/serial.rs` Драйвер UART 16550 на COM1. ### SerialPort ```rust pub struct SerialPort(pub u16); // номер порта ``` ### Инициализация UART (`init()`) ```rust port + 1 = 0x00 // отключение прерываний port + 3 = 0x80 // DLAB = 1 (доступ к делителю) port + 0 = 0x03 // делитель младший байт (~38400 бод) port + 1 = 0x00 // делитель старший байт port + 3 = 0x03 // 8N1: 8 бит, no parity, 1 stop bit port + 2 = 0xC7 // FIFO enable, clear, 14-byte threshold port + 4 = 0x0B // DTR + RTS (data terminal ready) ``` ### Методы | Метод | Описание | |---|---| | `is_transmit_empty() -> bool` | Проверка бита 5 Line Status Register | | `send(data: u8)` | Ждёт `is_transmit_empty()`, затем пишет в порт | | `write_str(s)` (fmt::Write) | Поcимвольная отправка | ### Функции | Функция | Описание | |---|---| | `init_global()` | Инициализирует COM1, сохраняет в `SERIAL_PORT` | | `write_global(args: Arguments)` | Пишет форматированную строку в serial | | `outb(port, val)` | `unsafe`: инструкция `out` (write I/O port) | | `inb(port) -> u8` | `unsafe`: инструкция `in` (read I/O port) | --- ## Логирование **Файл**: `src/debug.rs` ### LogLevel ```rust pub enum LogLevel { Info, // зелёный: ANSI \x1b[32m, RGB 0x00FF00 Warn, // жёлтый: ANSI \x1b[33m, RGB 0xFFFF00 Error, // красный: ANSI \x1b[31m, RGB 0xFF0000 } ``` ### Макросы #### `log!(console, level, module, $($arg)*)` Формат: `[ LOG ] | \n` Двойной вывод: - **Console**: цветной `[ LOG ]` (по LogLevel) + белый ` | ` - **Serial**: ANSI-цветной `[ LOG ]` + ` | ` + ANSI reset #### `info!(console, module, ...)` Обёртка над `log!` с `LogLevel::Info`. Зелёный `[ LOG ]`. #### `warn!(console, module, ...)` Обёртка над `log!` с `LogLevel::Warn`. Жёлтый `[ LOG ]`. #### `error!(console, module, ...)` Обёртка над `log!` с `LogLevel::Error`. Красный `[ LOG ]`. Все макросы экспортируются (`#[macro_export]`) и доступны из любого модуля.