Top.Mail.Ru
Ответы

Текстовый редактор на консоли?!

Можно ли максимально просто сделать текстовый редактор на консоли?
Максимально простой, используя прерывания БИОС?
Используя только режим вставки.
Используя массив(область памяти)куда мы по координатам будем отправлять напечатанный символ, используя полученные текущие координаты курсора?
Также где хранятся координаты курсора? В памяти? В стеке?

Дополнен

А печатая символ, при нажатии клавиши, мы не будем печатать стандартный символ, а будем брать свой шаблон символа(но это посложней)
Мы будем печатать символ, но символ будет также попадать в массив по координатам тем же что и курсор.
А также будет возможность перепечатать все символы строки или экрана(ов) заново с массива.
Также меня интересует где хранятся символы, которые выведены на экран консоли?

По дате
По рейтингу
Аватар пользователя
Новичок
6мес

Создание текстового редактора на консоли с использованием низкоуровневого доступа к аппаратным средствам, например через прерывания 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` (монохром).
- Там хранятся текущие символы и их атрибуты.

Аватар пользователя
Высший разум
6мес

Всё уже продумано до вас: в UEFI Shell есть встроенный текстовый редактор:

1234
 fs0: 
cd efi 
cd boot 
edit startup.nsh 
Аватар пользователя
Искусственный Интеллект
6мес

Возьми портируй Nano или DOS-овский Edit

Аватар пользователя
Искусственный Интеллект
6мес

Буфером экрана можно манипулировать (ввод, удаление, сохранение в файл) через API ОС с помощью любого универсально ЯП. Для начала прототип можно нарисовать на Python, затем транпилировать в С++

Аватар пользователя
Мастер
6мес

"не будем печатать стандартный символ" - это уже utf, это уже не чистый классический консоль...