| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для Windows/Dos > Работа с видеопамятью |
| Автор: Kuvaldis 24.6.2006, 00:31 |
| Про прерывание в WinXP мне объяснили. Еще вопрос. В ассемблерной вставке почему-то не получается не то, что записать, а просто ПРОЧИТАТЬ то , что находится по адресу видеопамяти с 0B800h. То же с байтом клавиатуры. Я же даже ничего не изменяю. Эти данные по другим адресам или...? А программа запущенная не из среды, выдает ошибку, в среде - зависание. Буду рад ответам. Заранее спасибо. |
| Автор: setty 24.6.2006, 13:49 |
| возможно проблема в том что винда тебя фиг пустит напрямую к видеопамяти. тут работать приходится немного не так как под досом, юзать надобно соответствующие API, а если хочеш прерываниями то придёца на ring0 кодить |
| Автор: Kuvaldis 24.6.2006, 15:29 | ||
Дайте ссылку, плз, где про это почитать, как зайти в этот ring-0 |
| Автор: setty 24.6.2006, 15:55 |
| инфу, если не найдёш я те ночью скину (как и тот исходник). Это довольно интересная но между тем довольно тяжолая тема, сам я несилён в этом. Могу лиш посоветовать на первых порах не парится с этим, практически любой вопрос сводится к тому какой набор nativ APIs тебе необходимо использовать. Ты можеш писать символы в консоль, устанавливать позицию курсора, задавать цвет и фон символов, устанавливать заголовок консоли, создавать и удалять консоли, перенаправлять ввод/вывод и все это риализуется в usermode посредством родных апи. Добавлю ктомуже что под Windows запустить код в ring0 доволно проблематично. Прийдётся писать драйвер. Хотя есть технологии перехода из в 3го в 0е однако они требуют знания предмета. |
| Автор: Romikgy 24.6.2006, 16:26 |
| Kuvaldis, ты можешь написать конкретно что тебе нужно сделать и в какой оси? |
| Автор: oleg1973 26.6.2006, 10:27 |
| какой вы бред несете зачем там ринг0 ? в винде есть и direct draw и direct 3D и openGL рисуй нехочу п.с. поиск по форуму рулит |
| Автор: setty 26.6.2006, 15:58 |
| ну спрашивал человек про прерывания и видеопамять... |
| Автор: rsm 26.6.2006, 20:10 |
| Kuvaldis, как вариант, пиши под ДОС что хочешь, а запускать будешь в DosBox. |
| Автор: setty 27.6.2006, 02:56 |
| я тоже задавал помнится подобные вопросы когда с доса на виндозу перешол програмить... понимаю как поначалу все может выглядеть дико, такчто, Kuvaldis, если чё обращайся... а вапще туторы икселиона те в помощ ) |
| Автор: sgi1981 31.7.2006, 11:39 | ||||||||
| В общем используйте АПИ-функцию SetDIBitsToDevice. Сначала я приведу цитату, а потом свое мнение. Цитата со страницы http://vsokovikov.narod.ru/Msdn_api/Global_SDK/Reference_API/Functions/Fn_S/fn_setdibitstodevice.htm
Из страницы http://doc.mpv.ru/steps/mfc/detail/30.html
А мое мнение таково, я не нашел более быстрого способа передавать изображение в WINDOWS-прикладной программе. Использовать эту функцию нужно таким образом. Вначале запишем структуру BITMAPINFO. В блоке памяти (массиве) запишем определенным образом двойные слова. Каждое двойное слово кодирует пиксел. Потом выводим этот массив на экран (можно в любую прямоугольную область экрана). И для оформления массива пикселов лучше программировать на Assembler с использованием инструкций расширений SSE, SSE2 АЛУ процессора. А вот моя демонстрационная программа, демонстрирующая возможности функции SetDIBitsToDevice. После запуска программы - поведите мышкой в разные стороны и убедитесь в том, что постороенное на весь экран изображение вообще не отстает от мыши ! Затем нажмите кнопку мыши и посмотрите на эффект. Выход из программы - клавиша ESC. Компонентов на форме не нужно.
|
| Автор: oleg1973 18.8.2006, 03:54 |
| sgi1981, а не быстрее будет через директдрав пИсать ? тоесть рисую в бекбуфере а потом копирую в примари сурфейс |
| Автор: sgi1981 18.8.2006, 07:36 | ||||||||
Ну а я же и рисую в буфере !
И для тех кто не понял, объясню - в данном случае masim - это указатель на буффер.
Ну а я что делаю ? Разве я не копирую буффер в память видеоадаптера ?
Здесь копирование из буффера делает функция SetDIBitsToDevice |
| Автор: oleg1973 18.8.2006, 14:03 | ||
|
| Автор: sgi1981 19.8.2006, 21:16 | ||||
Понимаешь. В твоем случае данные на самом деле данные не копируются из БЭКБУФФЕРа в ПРИМАРИСУРФЕЙС, а просто обе страницы видеопамяти меняются ролями. Видеоадаптер переключает адрес отображаемой части видеопамяти с одного значения на другое, и данные для передачи на монитор берутся просто уже из другого адреса. Если процессор непосредственно обращается к видеопамяти видеоконтроллера и пишет туда данные при выполнении написанных тобой инструкций - то действительно, такой путь наиболее быстрый ! А я и хотел узнать как так сделать, и ты подсказал. Но из тех пяти строчек кода понятна только часть сути, поскольку для того, чтобы они работали нужно ещё описание чего-то... В общем нужно будет книгу по DirectX искать. |
| Автор: oleg1973 20.8.2006, 17:21 |
| sgi1981, http://forum.vingrad.ru/index.php?showtopic=21242&hl=ddraw |