|
1 / 1 / 0
Регистрация: 11.10.2016
Сообщений: 13
|
|||||||||||
Вывод текста по точкам напрямую в видеопамять в графическом режиме24.09.2017, 15:26. Показов 7784. Ответов 16
Метки нет (Все метки)
Здравствуйте. Написал такую программу для вывода с помощью битовых карт текста. Не могли бы подсказать, в чём ошибка?
При запуске чёрный экран с постоянно движущимися полосами.
0
|
|||||||||||
| 24.09.2017, 15:26 | |
|
Ответы с готовыми решениями:
16
вывод текста в графическом режиме Вывод текста в графическом режиме |
|
Модератор
|
|
| 24.09.2017, 17:25 | |
|
Потому, что вы программируете 16-разрядное приложение, в котором нет и не может быть 32-разрядных регистров (esi).
Да и GS можно не трогать. Добавлено через 1 минуту Если хотите использовать расширенный набор команд - разместите .386 не во 2-й строке, а после объявления сегмента кода.
0
|
|
|
1 / 1 / 0
Регистрация: 11.10.2016
Сообщений: 13
|
||||||
| 24.09.2017, 17:29 [ТС] | ||||||
|
Уже переделал на вот такой вариант. Всё равно выводит не то, что нужно
0
|
||||||
|
Модератор
|
|
| 24.09.2017, 17:34 | |
|
0
|
|
|
1 / 1 / 0
Регистрация: 11.10.2016
Сообщений: 13
|
|
| 24.09.2017, 17:41 [ТС] | |
|
Я понимаю, но чем заменить ESI?
Если использовать SI, то будет illegal indexes mode . Или SI + byte ptr?
0
|
|
|
Модератор
|
||||||
| 24.09.2017, 17:55 | ||||||
|
Я не понимаю сути вычислений. Но заменить можно
0
|
||||||
|
1 / 1 / 0
Регистрация: 11.10.2016
Сообщений: 13
|
|
| 24.09.2017, 18:16 [ТС] | |
|
Заменил. Выводить по прежнему не выводит. Необходимо искать проблему именно в логике программы?
0
|
|
|
Модератор
|
|
| 24.09.2017, 18:30 | |
|
Видимо, да.
0
|
|
|
Прощай, Мир!
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
|
||||||||||||
| 25.09.2017, 01:22 | ||||||||||||
0
|
||||||||||||
|
1 / 1 / 0
Регистрация: 11.10.2016
Сообщений: 13
|
|
| 25.09.2017, 05:02 [ТС] | |
|
Графический. В процессе переделки комент немного сместился.
Про разницу между одинарными и двойными кавычками не знал, спасибо. По адресу 0F000:0FA6Eh как раз лежат битовые карты первой половины аски таблицы. Как я выяснил, у меня получает изначально не тот символ, что необходимо
0
|
|
|
Модератор
|
|||||||||||
| 25.09.2017, 07:29 | |||||||||||
|
Я не уверен. Мне кажется, что знакогенератор (битовые маски символов) из памяти видеоадаптера отображаются на основную память. Для получения адреса нужно обращаться к BIOS видеосервиса (int 10h), а не использовать константы так как использование русификатора меняет все адреса. К тому же, меняя содержимое регистров видеоконтроллера, можно отображать знакогенератор на произвольную память.
Добавлено через 8 минут Попробуйте потренироваться в доступе к таблицам знакогенератора в текстовом режиме - отображать большой символ звёздочками. Когда-то из любопытства написал программку для сравнения двух файлов шрифтов, а если на входе один файл, то сравнивался он с системным шрифтом. На форуме нашёл и использовал следующий код для получения таблицы знакогенератора
Добавлено через 9 минут Вот ещё нашёл. Программа переворачивает символы на экране. Виден доступ к таблице знакогенератора. Для вас тут интересна последовательность доступа к этой таблице
0
|
|||||||||||
|
1 / 1 / 0
Регистрация: 11.10.2016
Сообщений: 13
|
|
| 25.09.2017, 07:49 [ТС] | |
|
То есть использование англ.версии win98 решит проблему?
Да, вы правы. аски код.заглавной А меняется на 01h или 02h. Хотя, такое преобразование происходит для любого символа. Нужна функция 1102h,которая вернет адрес как раз таки шрифта 8х8?
0
|
|
|
Модератор
|
|
| 25.09.2017, 09:03 | |
|
Сейчас тороплюсь и не сверяю назначение функций. Во второй программе я использовал GetCurrentFontInfo - 1130h. Получал указатель на требуемую таблицу знакогенератора. А за 1102h сейчас ничего не могу сказать.
0
|
|
|
Эксперт Hardware
|
|||||||||||||||||||||||||||||||||||||
| 25.09.2017, 12:30 | |||||||||||||||||||||||||||||||||||||
Сообщение было отмечено Katzer как решение
Решение
Это-же значение должно лежать и таблице векторов: 43h * 4 = 010Ch
Вывод на экран в граф\режиме осуществляется построчно (ширина 1-ой строки = 1 пиксель), и если шрифт 9х16, то значит каждый образ символа ты должен прочитать 16-раз! То есть сначала первую строку (всех символов выводимой строки), потом вторую строку, и т.д. Чтобы выбрать из образов, какой именно символ будешь выводить, нужно к базе(3015h) прибавлять порядковый номер символа, например так:
Именно этим занимается знакогенератор адаптера при выводе символов на экран в графическом режиме. Геморно это\всё делать вручную и не понимаю, зачем это тебе нужно. Проще выставить графический режим и просто вызвать функцию вывода строки DOS - 09h. Она автоматизирует этот процесс сама.
3
|
|||||||||||||||||||||||||||||||||||||
|
Модератор
|
||||||
| 25.09.2017, 18:41 | ||||||
|
К такому шикарному пояснению добавлю ремарку.
Таблицы знакогенераторов: Int 1Fh - указывает на таблицу знакогенератора для ASCII кодов 80h-FFh в CGA-сопоставимых графических модах 4-6 (только 8x8); Int 43h - указывает на таблицу знакогенератора для ASCII кодов 00h-FFh в EGA/VGA графических режимах. Причём, размер глифа задаётся пользователем. А при установке этого шрифта ещё и выбирается число текстовых строк на экране (напомню, что это в графическом режиме). Эти таблицы используются для вывода символов средствами BIOS в графических режимах. Но у топикстартера задача вывести символы попиксельно (по крайней мере именно так я понял). Поэтому, какую таблицу он "урвёт", такой и будет шрифт. Т.е. ему достаточно "дотянуться" до любой из таблиц, правильно интерпретировать размеры глифов (символов) и вывести их на экран. Эти таблицы уже присутствуют в ROM BIOS, в крайнем случае их в RAM размещает русификатор - т.е. их не нужно устанавливать. Добавлено через 3 часа 55 минут Сделал с выводом каждой точки через функции BIOS (т.е. медленно). Но лично мне было любопытно "дотянуться" до таблиц знакогенератора. Не соображу почему шрифт получился таким крупным. Возможно, из-за выбранного видеорежима. Сам алгоритм простой - вызвал Get EGA information (int 10h ax=1130h) с выбранным шрифтом (наугад взял 8x14). Получил указатель на знакогенератор. Потом просто - по символу из выводимой строки получаю смещение в знакогенераторе до глифа (код символа * размер глифа), а потом вывожу битовое изображение глифа. Никогда не интересовался графикой, поэтому не понимаю, как напрямую выводить точки в память. Поэтому вывожу через видеосервис.
0
|
||||||
|
1 / 1 / 0
Регистрация: 11.10.2016
Сообщений: 13
|
|
| 25.09.2017, 22:46 [ТС] | |
|
Спасибо вам всем огромное за вашу отзывчивость и столь полезные и обширные объяснения!
Добавлено через 1 минуту Я бы использовал прерывание БИОСА, но препод требует использовать именно запись напрямую в видеопамять. И делай что хочешь с этим.
0
|
|
|
Модератор
|
|
| 25.09.2017, 22:50 | |
|
Это особенность любого форума - часто решения не полные, что-то приходится "допиливать".
0
|
|
| 25.09.2017, 22:50 | |
|
Помогаю со студенческими работами здесь
17
Вывод текста в графическом режиме (tasm)
Вывод текста в графическом режиме (оптимизация) турбо паскаль(вывод текста в графическом режиме) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|