Текстовый редактор на консоли?!
Можно ли максимально просто сделать текстовый редактор на консоли?
Максимально простой, используя прерывания БИОС?
Используя только режим вставки.
Используя массив(область памяти)куда мы по координатам будем отправлять напечатанный символ, используя полученные текущие координаты курсора?
Также где хранятся координаты курсора? В памяти? В стеке?
А печатая символ, при нажатии клавиши, мы не будем печатать стандартный символ, а будем брать свой шаблон символа(но это посложней)
Мы будем печатать символ, но символ будет также попадать в массив по координатам тем же что и курсор.
А также будет возможность перепечатать все символы строки или экрана(ов) заново с массива.
Также меня интересует где хранятся символы, которые выведены на экран консоли?
Создание текстового редактора на консоли с использованием низкоуровневого доступа к аппаратным средствам, например через прерывания BIOS, возможно, хотя и довольно ограничено. Давайте разберем все ключевые аспекты и требования вашего вопроса.
### Основная идея редактора
1. **Хранение символов**:
- Создаем массив в памяти, где будут храниться символы и их атрибуты (цвет и т.д.), соответствующие экрану. Например, для текстового режима 80x25 можно использовать массив размером 80x25.
2. **Ввод символов**:
- При вводе символа записываем его в массив по текущим координатам курсора, а затем отображаем его на экране.
3. **Отображение символов**:
- Символы отображаются на экране, используя прерывания BIOS (например, `INT 10h`) или прямую запись в видеопамять.
4. **Координаты курсора**:
- Координаты курсора можно получить через BIOS (функция `INT 10h`, `AH=03h`) или самостоятельно отслеживать в программе.
5. **Обновление экрана**:
- Реализуем функцию, которая "перерисовывает" экран, выводя все символы из массива.
---
### Примерный алгоритм
#### 1. Хранение символов в массиве
Создаем массив, например, `char screen[25][80]`, для хранения символов.
#### 2. Получение координат курсора
Используем прерывание BIOS:
```asm
MOV AH, 03h ; Запрос текущей позиции курсора
MOV BH, 0 ; Номер страницы (0)
INT 10h ; Вызов BIOS
; После вызова
; CH содержит номер строки (Y)
; CL содержит номер столбца (X)
```
#### 3. Установка курсора
Чтобы переместить курсор:
```asm
MOV AH, 02h ; Установка позиции курсора
MOV BH, 0 ; Номер страницы
MOV DH, <строка> ; Y-координата
MOV DL, <столбец> ; X-координата
INT 10h ; Вызов BIOS
```
#### 4. Ввод и отображение символа
Считываем нажатую клавишу:
```asm
MOV AH, 00h ; Ожидание нажатия клавиши
INT 16h ; BIOS клавиатурный ввод
; AL содержит ASCII-код клавиши
```
Отображаем символ:
```asm
MOV AH, 0Eh ; Вывод символа в текущей позиции курсора
MOV AL, <символ> ; ASCII-код символа
MOV BH, 0 ; Номер страницы
INT 10h ; Вызов BIOS
```
#### 5. Перерисовка строки или экрана
Перебираем массив `screen` и выводим каждый символ в нужную позицию с помощью вышеуказанных функций.
---
### Хранение символов в видеопамяти
- В текстовом режиме символы и их атрибуты хранятся в **видеопамяти**:
- Адрес: `B800h` (для цветного режима) или `B000h` (для монохромного).
- Формат: каждый символ занимает 2 байта:
- Первый байт: ASCII-код символа.
- Второй байт: атрибут символа (цвет текста и фона).
Пример записи в видеопамять:
```asm
MOV AX, B800h ; Адрес видеопамяти
MOV ES, AX ; Загружаем в сегмент ES
MOV DI, <позиция> ; Смещение в видеопамяти (Y * 160 + X * 2)
MOV AL, <символ> ; ASCII-код символа
MOV AH, <атрибут> ; Атрибут (цвет текста и фона)
MOV [ES:DI], AX ; Записываем в видеопамять
```
---
### Сложность с пользовательскими символами
Чтобы использовать свои шаблоны символов, необходимо работать с таблицей шрифтов в графическом режиме. Это значительно сложнее, поскольку требует загрузки шрифта в память и настройки соответствующей таблицы символов. Это возможно через:
- **BIOS**: Например, `INT 10h`, функция `AH=11h` для изменения шрифта.
- **Прямой доступ к VGA**: Изменение таблицы символов напрямую через порты VGA.
---
### Где хранятся символы на экране?
1. **Видеопамять**:
- Для текстового режима: адрес `B800h` (цвет) или `B000h` (монохром).
- Там хранятся текущие символы и их атрибуты.
Всё уже продумано до вас: в UEFI Shell есть встроенный текстовый редактор:
fs0:
cd efi
cd boot
edit startup.nsh
Возьми портируй Nano или DOS-овский Edit
Буфером экрана можно манипулировать (ввод, удаление, сохранение в файл) через API ОС с помощью любого универсально ЯП. Для начала прототип можно нарисовать на Python, затем транпилировать в С++
"не будем печатать стандартный символ" - это уже utf, это уже не чистый классический консоль...