Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Записать пиксел экрана...

11K
20 февраля 2006 года
ArtemESC
14 / / 19.02.2006
Как записать(считать)определенный пиксел экрана
на ассемблере без прерываний и функций
какой-либо ОС?
3.8K
20 февраля 2006 года
Supervisor
158 / / 29.05.2005
Какой видеорежим? Как инициализирован видеорежим (VGA-BIOS, VESA-BIOS)? Тип адресации видеопамяти: банки или LFB?
12K
21 февраля 2006 года
patriotLviv
10 / / 13.10.2005
Цитата:
Originally posted by ArtemESC
Как записать(считать)определенный пиксел экрана
на ассемблере без прерываний и функций
какой-либо ОС?


Це все залежить від відеорежиму Якщо ти використовуєш SVGA з LFB буфером тоді початок відеопамяті по замовчуванню буде 0xD00000(це лінійна адреса) і якщо режим 256 колірний то кожен байт відповідає кольором пікселя. Наприклад запис по адресі [0xD00000] байта 0x04 виведе червону крапку в лівому верхньому кутку.(червоний буде якщо не перепрограмовувати палітру)
А якщо ти використовуєш 32 бітний режим (64kb колоьрів), то кожен піксель адресується трьома байтами RGB плюс байт яскравості(байт яскравості не працює, не використовуй його)

3.8K
21 февраля 2006 года
Supervisor
158 / / 29.05.2005
Цитата:
початок відеопамяті по замовчуванню буде 0xD00000(це лінійна адреса)


Адрес LFB не является статическим, т.е. на разных машинах может быть разным.

8.4K
22 февраля 2006 года
Dian
91 / / 18.02.2006
Цитата:
Originally posted by ArtemESC
Как записать(считать)определенный пиксел экрана
на ассемблере без прерываний и функций
какой-либо ОС?



 
Код:
mov [video_address], color

Основная проблема - определить адрес ;)
252
22 февраля 2006 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by Dian
 
Код:
mov [video_address], color

Основная проблема - определить адрес ;)


если бы всё было так просто :)
сам то адрес легко получить (lfb) , а вот писать туда будет посложнее .:D

8.4K
22 февраля 2006 года
Dian
91 / / 18.02.2006
koderAlex
Почему?
243
24 февраля 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Dian
koderAlex
Почему?


Йэх... Ну почему ни кто не читает матчасть, а сразу садится если не ОСь, то драйвер писать? :)
Виртуальный/защищенный режим о чем-нить говорит?

8.4K
24 февраля 2006 года
Dian
91 / / 18.02.2006
Цитата:
Виртуальный/защищенный режим о чем-нить говорит?


Какая разница, какой режим, если video_address уже замэплен и учитывает все страничные и сегментные преобразования? Иначе его было бы очень просто получить, как уже замтил koderAlex, но для мува он бы решительно не подошел ;)

243
24 февраля 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Dian
но для мува он бы решительно не подошел ;)


Ага. А почему?

8.4K
24 февраля 2006 года
Dian
91 / / 18.02.2006
Цитата:
Originally posted by pacific_7
Ага. А почему?


Страничная адресация о чем-нить говорит? :)

243
24 февраля 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Dian
Страничная адресация о чем-нить говорит? :)


Ладно, кто в лес, кто по дрова в общем.

349
26 февраля 2006 года
Phantom-84
656 / / 27.10.2005
Судя по всему ArtemESC задал свой абстрактный вопрос и безвозвратно исчез... Ему абсолютно справедливо задали уточняющий вопрос, но он никак на него не прореагировал. Если вас увлекают отвлеченные рассуждения на эту тему, не забудьте про видеорежимы, в которых для формирования одного пиксела на экране нужно было записывать цветовые составляющие в разные участки видеопамяти или же записывать в одно место, но между отдельными операциями записи переключать цветовые плоскости. Артём, зачем тебе ассемблер! Возьми обычный маркер и вперед :)
252
26 февраля 2006 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by Dian
Какая разница, какой режим, если video_address уже замэплен и учитывает все страничные и сегментные преобразования? Иначе его было бы очень просто получить, как уже замтил koderAlex, но для мува он бы решительно не подошел ;)


в защищённом режиме надо попросить систему выделить страницу нужного размера и расположенным но полученному ранее физическому адресу . Если система позволит тебе такое ,то по полученному логическому адресу писать mov(s) [].
если же не прошло то есть обходные манёвры ))
например поиск страницы с нужными физическими адресами ,
поднять привилегиии (если надо )) ) и писать туда (напрямую или через VDMA )

8.4K
26 февраля 2006 года
Dian
91 / / 18.02.2006
Вроде всё верно

P.S. Artem[color=red]ESC[/color]
2.7K
05 июля 2007 года
barracuda
76 / / 29.03.2004
Цитата: koderAlex
в защищённом режиме надо попросить систему выделить страницу нужного размера и расположенным но полученному ранее физическому адресу . Если система позволит тебе такое ,то по полученному логическому адресу писать mov(s) [].
если же не прошло то есть обходные манёвры ))
например поиск страницы с нужными физическими адресами ,
поднять привилегиии (если надо )) ) и писать туда (напрямую или через VDMA )



Подскажи, а как получить физический адрес видео памяти?

551
05 июля 2007 года
Pavia
357 / / 22.04.2004
Есть как минимум 3 способа.
Используем прерывания VESA. Читаем VBE3.pdf .
Используем порты ввода/вывода для работы с PCI
Ищим видео карту читаем BAR регистры ищим с выставленным битом Prefetchable - это и будет виде память
Используем сервисы ОС. Зависит от ОС.
2.7K
06 июля 2007 года
barracuda
76 / / 29.03.2004
Цитата: Pavia
Есть как минимум 3 способа.
Используем прерывания VESA. Читаем VBE3.pdf .
Используем порты ввода/вывода для работы с PCI
Ищим видео карту читаем BAR регистры ищим с выставленным битом Prefetchable - это и будет виде память
Используем сервисы ОС. Зависит от ОС.


Кинь какой нить докой в меня, начиная с "Ищим видео карту..."

2.7K
06 июля 2007 года
barracuda
76 / / 29.03.2004
Кста
Есть 4-й способ (под винду)
Открываем ДиректХ, получаем первичную поверхность, лочим, это есть виртуальный адрес видео памяти, от него берем линейный
Сейчас у меня именно так работает
Но хочу избавится от директа
2.7K
10 июля 2007 года
barracuda
76 / / 29.03.2004
Нашел пример, посмотрите правилдьно ли я его понимаю, будет ли этот код работать?


_VMI VIDEO_MEMORY_INFORMATION <?>

;Получаем имя девайса
invoke IoGetDeviceInterfaces, offset GUID_DEVINTERFACE_DISPLAY_ADAPTER, 0, DEVICE_INTERFACE_INCLUDE_NONACTIVE, offset pw
invoke RtlInitUnicodeString, offset uDevName, pw

;подучаем DeviceObject по имени девайса
invoke IoGetDeviceObjectPointer, offset uDevName, FILE_READ_DATA, offset FileObject, offset DeviceObject
invoke ExFreePool, pw

;создаем событие
invoke KeInitializeEvent, offset event, NotificationEvent, FALSE

;атачим дивайс
invoke IoGetAttachedDeviceReference, DeviceObject
mov targetObject, eax

;мапируем видеопамять в виртуальную память
invoke IoBuildDeviceIoControlRequest, IOCTL_VIDEO_MAP_VIDEO_MEMORY, targetObject, offset videoMemory, sizeof VIDEO_MEMORY, offset _VMI, sizeof VIDEO_MEMORY_INFORMATION, FALSE, offset event, offset ioStatusBlock
mov _irp, eax

;проверяем
invoke IoCallDriver, targetObject, _irp
.if eax==STATUS_PENDING
invoke KeWaitForSingleObject, offset event, Executive, KernelMode, FALSE, NULL
.endif

;освобождаем дивайс
invoke ObDereferenceObject, targetObject

;в _VMI.FrameBufferBase имеем виртуальный адрес текущего контекста
334
12 июля 2007 года
HexEdit
809 / / 27.07.2006
Верну к теме (выделено):
[quote=ArtemESC]Как записать(считать)определенный пиксел экрана
на ассемблере без прерываний и функций
какой-либо ОС
?[/quote]
[size=1]PS. Если автор в течении недели-двух не появится, придется тему закрыть[/size]
261
12 июля 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: ArtemESC
на ассемблере без прерываний и функций какой-либо ОС?


в Win32 это невозможно! про linux нечего не могу сказать, наверно тоже невозможно

1.9K
13 июля 2007 года
disasm
232 / / 06.02.2006
В любом случае это раельно сделать на нулевом кольце. Только вот если это под виндой или под какой-нибудь другой PM ОС, то могут быть проблемы после этой проги.
Можно просто-напросто через порты выставить режим VGA 640x480x16c, а потом уже считывать/записывать пиксели прямо в стандартно отведенную для этого область физической памяти (0xa0000 вроде бы). Если текущий режим - PM+PG, то еще нужно спроецировать эту память на виртуальную.
261
15 июля 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: disasm
Только вот если это под виндой или под какой-нибудь другой PM ОС, то могут быть проблемы после этой проги.


например в винде это скорее всего BSOD.

2.7K
16 июля 2007 года
barracuda
76 / / 29.03.2004
Под виндой никакого BSOD, все работает без проблем, лично у меня вопрос в другом - как получить линейный адрес видео памяти (в нулевом кольце)
Но, похоже, никто не знает, как это делается точно.
252
16 июля 2007 года
koderAlex
1.4K / / 07.09.2005
из PCI пространства видюхи попробуй .
551
16 июля 2007 года
Pavia
357 / / 22.04.2004
Чем тебе тот код, который ты нашел не понравился?
Я уже упоминал что из конфигурационного пространства PCI можно узнать. Где описано? Я могу тебя отправить к снадрату PCI.

Код не проверял писал прямо сдесь. Процедура FindDevice3 отлажена. А вот то что ниже даже и не проверял.
Код:
;*********************************
;Функция для поиска устройства по его базовому классу
; EAX -его класс.
; На выходи адрес если нет то -1
;***********************************
FindDevice3 proc
PUSH EBX
PUSH ECX
PUSH EDX

MOV EBX, EAX        ; Сохраняем
MOV ECX, 80000000h     ; Счетчик он же адрес
@@Label1:

AND ECX, 0FFFFFF00h    ; Выравниваем
MOV EAX, ECX
MOV DX, 0CF8h
OUT DX, EAX           ; Устанавливаем адрес
MOV DX, 0CFCh
IN EAX, DX            ; Читаем регистр
CMP EAX, 0FFFFFFFFh    ; Не существующее устройство.
JE @@Label2
ADD ECX, 08           ; Наш Регистр
MOV EAX, ECX
MOV DX, 0CF8h
OUT DX, EAX           ; Устанавливаем адрес
MOV DX, 0CFCh
IN EAX, DX            ; Читаем регистр
SHR EAX, 24         ;
CMP EAX, EBX
JE @@Label3         ; Ура нашли

@@Label2:
ADD ECX, 256

           
CMP ECX, 80FFFF00h  ; Максимум 256 шин.             
JNE @@Label1
MOV ECX, 0FFFFFFFFh ; Не нашли

@@Label3:
XOR EAX, EAX        ; Сбрасываем адрес
MOV DX, 0CF8h       ; Чтобы не было претензий.
OUT DX, EAX           ;

AND ECX,0FFFFFF00h     ; Сбрасываем индекс регистра
MOV EAX, ECX
POP EDX
POP ECX
POP EBX
RET

endp

start:
mov EAX,03h ; Ищем видео карту её базовому классу.
call FindDevice3
mov EBX, EAX
ADD EBX, 10h       ; 10h-28h 6 BAR регистров
MOV ECX, 6
@@Loop:

MOV EAX,EBX
mov DX, 0CF8h
OUT DX,EAX

mov DX, 0CFCh
IN EAX,DX

AND EAX, 1001b  ; БИТ 0=0 адрес в памяти, 1 адрес портов в/в
CMP EAX, 1000b  ; Бит 3 Prefetchable отличаем видео память от Memory Mapped I/O  
JE @@Found

IN EAX,DX
AND EAX, 111b
CMP EAX, 100b   ; 64битный адресс
JNE @@Adr32
ADD EBX, 4        ; стандарт, что тут скажешь
@@Adr32:
ADD EBX, 4
DEC ECX
JNZ @@Loop
@@Found:
MOV EAX,EBX
mov DX, 0CF8h
OUT DX,EAX

mov DX, 0CFCh
IN EAX,DX
AND EAX,0FFFFFFF0h   ; Пока о 64битных адресах не слово

end start
2.7K
16 июля 2007 года
barracuda
76 / / 29.03.2004
Вот! Ближе к теме!
Спасиб!
Буду пробовать
(терь понятно куда курить)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог