LinuxForum.Fans
Тема

из консоли вернуть разрешение 80х25

Автор: v4567 9 сообщений 1614 просмотров
02.04.2019 16:54 #431296

Без графики в консоли загружается фреймбуфер.

text

uname -a
Linux 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux

Может ошибаюсь, но выгрузить фреймбуфер и вернуть буквенно-цифровой режим 80х25 нельзя, если можно то как? Если нельзя, то как из консоли, не при загрузке через grub!, а из самой консоли поменять разрешение этого фреймбуфера, или поменять количество строк и столбцов?
Установлен пакет kbd, при помощи утилиты resizecons поменять количество столбцов и строк не получается. Например:

text

resizecons 80x25
resizecons: resizecons: не удалось найти файл видеорежима 80х25

Ранее в гугле находил информацию, что resizecons написана с ошибкой и менять при помощи её количество строк и столбцов бесполезно, надо пользоваться - сейчас не помню уже чем, но тогда с этой другой утилитой то же были проблемы и изменить количество строк и столбцов так и не удалось. Сейчас эту информацию не могу найти в гугле. Если кто знает подскажите пожалуйста.

02.04.2019 17:43 #431297
"v4567" написал:
Может ошибаюсь, но выгрузить фреймбуфер и вернуть буквенно-цифровой режим 80х25 нельзя, если можно то как?
на лету - чёрт его знает, а через grub параметром nomodeset

"v4567" написал:
надо пользоваться - сейчас не помню уже чем

fbset?

Зы
А чем не устраивает просто в grub один раз указать нужное разрешение?

04.04.2019 23:09 #431333

Да точно fbset.
Попробовал поменять размеры но когда посмотрел, у меня 1024х768, удалось выставить и реальные и виртуальные размеры 640х400, но сам размер знакоместа не изменился, в результате стало использоваться приблизительно пол экрана и размерами знакоместа такими какими они были ранее при 1024х768. Мне нужно именно увеличить размер знакоместа. Может это и можно сделать как то при помощи шрифтов, но как? У меня не получилось загрузить какие нибудь графические шрифты в фреймбуфее.
Немного прояснилось.
Я очень давно на ассемблере писал программу которая записывала шрифт в знакогенератор и потом выводила символы.
Разрешение там никак не зависело от шрифта, разрешение выставлялось некоторым кодом на порт ввода, могло быть 40х25 или 80х25 и т. д. и под эти разрешения надо было делать шрифты, если при разрешении 40х25 загрузить шрифт 8х16 то вторая половина буквы была бы всё время пустая, или наоборот при 80х25 загрузить (кстати не знаю может шрифт и не загрузился бы) шрифт 16х16 то всё время будет пол буквы.
В нашем случае - при linux-е когда мы загружаем шрифт то операционная система смотрит что за шрифт и в начале выставляет нужное разрешение, а потом грузит шрифт в знакогенератор.
Сейчас я загрузился в буквеноцифровом режиме без фреймбуфера и поэксперементировал с загрузкой разных шрифтов:
8х8 даёт режим 80х50
8х16 80х25
8х14 80х28 удивительно что он загрузился
latarcyrheb-sun32 оказался шрифтом 16х32 с количеством смволов 512 и в чистой буквенноцифровой консоли он не загрузился выдав ошибку - putfont: KDFONTOP недопустимый аргумент, а вот в фрейм буфере он отлично загрузился уменьшив количество столбцов и строк, скорее всего в фреймбуфере свой виртуальный (не аппаратный) знакогенератор, в который можно грузить и такие шрифты.
Ненашёл пока шрифт 16х16 он должен дать разрешение 40х25, попробую сделать сам и загрузить, посмотрю поменяется ли разрешение на 40х25.
Добавлено: 04.04.2019 22:09:01

Сделал сам шрифт 16х16 но в чистой буквенноцифровой консоли он не загрузился выдав ошибку - putfont: KDFONTOP недопустимый аргумент.

05.04.2019 20:39 · отредактировано #431338
"v4567" написал:
Сделал сам шрифт 16х16 но в чистой буквенноцифровой консоли он не загрузился выдав ошибку - putfont: KDFONTOP недопустимый аргумент.

В аппаратных текстовых режимах знакогенератор на 8 точек (на 8 бит) по ширине. 9-й бит рисуется картой самостоятельно, дублирование адаптером крайнего правого бита позволяет отображать линии псевдографики непрерывными (речь о диапазоне 0xB0-0xDF), это поведение можно отключать или включать.

06.04.2019 02:08 #431339

Извиняюсь за надоедливость.
В чистой (не эмулятор терминала, загрузился передав ядру параметр nomodeset) буквенноцифровай консоли 80х25 (без фреймбуфера!) загрузил командой setfont шрифты, в ascii первый символ идёт NUL, потом SOH и т. д.
В моих же шрифтах первым идёт символ копирайта - "С" в кружке, далее идут то же вполне печатные символы.
По команде showconsolefont они все прекрасно выводятся на консоль, все 256 символов.
Далее попытался вывести первый символ копирайта командой echo:

text

echo -e "\x00"

Но вывелось пустое место, при помощи такого вывода, выводятся: латиница, кириллица, цифры, а вот символы псевдографики вывести не удалось, вместо символов псевдографики выводится ромбик.
Я не пойму почему так?
И как можно вывести символы из командной строки, которые есть в шрифте.
Некоторые спросят меня, зачем мне это когда есть графика, отвечаю. Хотел написать небольшую игру на баше и в шрифтах сделать некоторые изображения, комбинируя которые можно кое что нарисовать. Я понимаю что в эмуляторе, да и во фреймбуфере это работать не будет, но я просто хотел попробовать как у меня это получится в чистой консоли. Ведь линукс для людей, всё можно настроить, подправить исходники и вот тут сразу споткнулся казалось бы в простом. А теперь уже даже интересно почему echo не выводить некоторые символы из шрифта, при этом showconsolefont прекрасно выводит все символы которые есть в шрифте.
И ещё, если при изменении шрифта не записать таблицу перекодировки для юникода, то кириллица не выведется, вместо неё будут вопросительные знаки. Ну откуда в чистой консоли может фигурировать юникод?
Последний момент, неужели нет никакого способа как можно поменять количество столбцов и строк во фреймбуфере, уменьшив их количество при этом увеличив размеры знакоместа, кроме как записывая в виртуальный знакогенератор шрифт размерами 16х32? Команда fbset меняет разрешение, например с 1024х768 на 640х400 но при этом размер знакоместа не меняется, он как был маленьким так и останется, в результате начинает использоваться пол экрана, а вторая половина не используется.

06.04.2019 08:17 · отредактировано #431340

v4567,
шрифт обычно содержит карту изображений символов (глифов), при выводе на терминал производится перекодировка и запись в видеопамять кода, соответствующего глифу перекодированного символа. Это позволяет «не пропадать даром» области непечатных символов.

Например, консоль настроена в Юникоде. Вы выводите символ «(c)», по таблице перекодировки шрифта производится проверка наличия глифа для символа, если такого нет, то в знакомксто видеопамяти пишется код глифа для отсутствующего символа, если такой назначен, иначе пишется код соответствующего глифа. Отрисовку глифа по коду знакоместа делает видеоадаптер самостоятельно.

Из-за использования карты символов, выводимый символ не является непосредственно выводимым в видепамять кодом.

setconsolefont получает карту символов шрифта и выводит все содержащиеся в ней символы. Их может быть сильно больше 256 или 512 (в этом режиме используется бит яркости для выбора второго 256-символьного набора) за счет использования одного глифа для похожих по начертанию символов, например, «a» латинская и русская. Примером таких шрифтов является набор ter-vNNv.

Добавлено: 06.04.2019 08:17:41

Ах да, ответить на вопрос «почему consolefont ...» можно было проще — исходники открыты, достаточно почитать.

Желаемое (построение изображений из нескольких глифов символов, подобное делали Norton Utilities для DOS) сделать несложно —достаточно загрузить свой шрифт, но, если правильно путаю, прав обычного пользователя для этого недостаточно. Плюс, это точно будет проблемой для запустивших в псевдотерминале, например, по ssh.

07.04.2019 23:09 #431341

На другом форуме подсказали, надо вот так писать:

text

echo -e "\ua9"

так работает, выводится символ копирайта.
По логике вещей можно предположить следующее, echo передаёт в ядро число, а ядро воспринимает это как число-код юникода, так как локаль установлена в utf8, потом по таблице перекодировке (которая расположена в файле шрифта) ищет соответствие и выводит соответствующий символ.
В таблице перекодировки, которая расположена в файле шрифта, в первой строке, получается для первого символа - первого знакоместа:

text

0x000 U+00a9

В шрифте это символ копирайта.
Непонятно вот что, я ведь для echo явно в шестнадцатиричном виде указывал на него - x00, но почему то так не работает. Получается что x00 воспринимается как юникод....?
Добавлено: 07.04.2019 22:09:12

"bormant" написал:
речь о диапазоне 0xB0-0xDF

Спасибо за информацию.

Кое что прояснилось:
Все символы можно посмотреть командой:

text

showconsolefont

Или раскрыть файл шрифта:

text

gunzip font.psf.gz   # разархивирую файл со шрифтом
psfgettable font.psf font.table  # вынимаю из него таблицу перекодировки, если локаль utf8 то таблица перекодировки будет для юникода
psf2txt font.psf font.txt  # преобразовываю файл шрифта в текстовый вид, этот файл можно редактировать в текстовом редакторе, что именно редактировать можно догадаться по содержимому этого файла

Если кому интересно, то после редактирования шрифта можно всё собрать в обратном порядке:

text

txt2psf newfont.txt newfont.psf  # создаём новый файл шрифта
mv newfont.psf newfont1.psf  # переименовываем файл шрифта
psfaddtable newfont1.psf font.table newfont.psf  # записываем таблицу перекодировки в новый фал шрифта, таблицу перекодировки то же можно отредактировать - это текстовый файл
gzip newfont.psf  # архивируем файл шрифта
setfont newfont.psf.gz  # записываем наш новый шрифт в знакогенератор, теперь будет работать этот шрифт

Там где в шрифте элементы псевдографики, (имеются ввиду ячейки знакогенератора) наверное сам знакогенератор продолжает изображение копируя последний столбец, поэтому символы псевдографики изображаются непрерывными. Остальные символы будут разделены полоской шириной в один столбец. Поэтому если нужно создать свои символы псевдографики или какие нибудь изображения, то в файле шрифта менять нужно именно эти ячейки.

И выводить, как подсказали на другом форуме, можно так:

text

echo -e "\u......"

где:

text

\u......

код юникода, можно посмотреть в вынутом файле таблицы перекодировки, например:

text

echo -e "\ua9"

выведет первый символ - копирайт, это в шрифте которые у меня, в другом шрифте может быть и другой символ.

Остались невыясненными следующие вопросы:

Как изменить в чистой текстовой консоли количество выводимых строк и столбцов, без перезагрузки, из самой консоли?
Ведь есть режимы 40х25, 160х50 и т.д.
Для этого есть команда:

text

resizecons 160x50
resizecons: resizecons: не удалось найти файл видеорежима 160х50

Вроде как надо - поставить svgalib, который принесет restoretextmode, который сгенерит файл 80x25, который...

Дистрибутив у меня devuan - это ветка от debian без systemd.
В нём в репозиториях svgalib нет. Скачал deb пакет и попытался из него использовать restoretextmode, но оказалось что нет библиотеки svgalib, её поставить так и не удалось.
Может этот файл можно создать вручную в текстовом редакторе?

Второй вопрос как изменить количество выводимых столбцов и строк в фреймбуфере, не прибегая к загрузке шрифта разрешением 16х32
fbset не подходит, так как:
например у меня 1024х768, удалось выставить и реальные и виртуальные размеры 640х400, но сам размер знакоместа не изменился, в результате стало использоваться приблизительно пол экрана с размерами знакоместа такими какими они были ранее при 1024х768.

08.04.2019 15:29 #431342

"v4567" написал:
Непонятно вот что, я ведь для echo явно в шестнадцатиричном виде указывал на него - x00, но почему то так не работает.
Потому что там будет работать точно та же последовательность выбора глифа (в utf8 верхняя половина ASCII точно такая же): echo передаёт в ядро число 0, а ядро воспринимает это как число-код юникода, так как локаль установлена в utf8, потом по таблице перекодировки (которая расположена в файле шрифта) ищет соответствие для символа с кодом 0 -- вы ведь его просили вывести -- и выводит соответствующий символ.
Войдите или зарегистрируйтесь, чтобы ответить.