Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Jack Vykrmen 10. 12. 2016, 17:11:12

Název: Přímý přístup do videopaměti
Přispěvatel: Jack Vykrmen 10. 12. 2016, 17:11:12
Lze nějak na dnešních moderních počítačích, založených na intel procesorech a grafických kartách zapsat přímo bajt do videopaměti?
Jako že bych zapsal v nějakém assembleru něco jako

mov ax,FFh :P
mov (ta adresa), ax  :-[

a že by mi to na monitoru nakreslilo čárku.
Nebo tečku, to fakt nevím, proto se ptám, vysvětlete mi někdo prosím, jak to v takhle naprostém základu funguje.
Název: Re:adresa ve videopaměti
Přispěvatel: JmJ 10. 12. 2016, 18:14:16
Pokud pouzijes OS, ktery ti to dovoli, tak by to samozrejme jit melo. Nevim, jestli linux/widle tohle umoznuji. Hardware to samozrejme zvladne (doufam ;-)). Dlouho jsem tyhle veci nedelal, ale pokud existuje jeste neco jako byval VESA bios, tak by se videopamet mela mapovat na nejakou adresu pameti a pokud budes mit moznost do teto pameti psat, tak proste zapises a hotovo. Pixel po pixelu.
Název: Re:adresa ve videopaměti
Přispěvatel: JardaP . 10. 12. 2016, 18:27:34
Rekl bych, ze s ohledem na to, ze ty videokarty se prepinaji do ruznych rezimu, to mapovani urcite silne zavisi na zvolenem rezimu a zapisovani obrazu pixel po pixelu bez pouziti ovladace nebude takova sranda. Doba CGA uz davno minula.
Název: Re:adresa ve videopaměti
Přispěvatel: Martin Dráb 10. 12. 2016, 20:09:27
Jak již bylo řečeno, záleží na konkrétním grafickém režimu. Začátek grafické videopaměti (asi) pro VGA režimy je namapován na fyzickou adresu $A0000 ($A000:$0 v reálném režimu např.). Pro textové režimy to bylo $B8000. Ale jak říkám, musel být nastavený správný grafický režim. Pro grafické režimy, u nichž reprezentace obrazovky přesáhla 64 KB se zápis dost komplikoval, protože bylo nutné přepínat jednotlivé 64 KB bloky (bank switching). Proto bývalo dost oblíbené rozlišení 320x200 a 256 barev, zejména v dobách, kdy byl reálný režim procesoru rozumně dosažitelný.

Pokud svůj kód hodíte do ovladače jádra, WIndows vám samozřejmě "dovolí" (ve skutečnosti je to vlastně procesor) shat na přímo na HW, ale není to dobré dělat, protože o takových přístupech systém neví a velmi snadno může dojít k chybám souběhu s dost nepříjemnými následky. Krom toho se nedá říci, že by se tyto (asi VGA) režimy dnes zrovna používaly...

Dalo se (to už asi byla věc VESA, v těchto označeních se moc nevyznám) dosáhnout i vyšších rozlišení (s rozumným počtem barev) a namapovat obrazovku na souvislý blok fyzické paměti, ale nebyla to zrovna triviální operace (návod už bohužel nemám, už je to tak 12 let).
Název: Re:adresa ve videopaměti
Přispěvatel: Trident 10. 12. 2016, 20:25:57
Da. Kazda karta musi tahat s sebou kompatibilni kouli na noze jinak nelze nazyvat pocitac IBM PC kompatibilni. Posledni verze VESA mely i moznost vyuziti 2D akcelerace karet. Bylo budto mozne vyuzit megapomale sluzby biosu a nebo zapisovat primo(dnes uz tuto emulaci stejne resi zas bios/firmware grafickych karet) tak jak pises. Pokud je karta ve VGA nebo VESA kompatibilnim rezimu tak to funguje. Rezim kompatibility umoznuji s ruznym mnozstvim bugu i nejnovejsi karty.
Mozne to je, ale nejpohodlnejsi je nahodit si DOS a zkouset to v emulaci.  To za nasich mladych let nebylo a tlacitko reset bylo tvym kamaradem:) Na opicarny ze si napises modul jadra bych se zatim vykvajznul. V pripade takovych erotickych myslenek ale doporucuji prvne se mrknout na obecne fb moduly.
Název: Re:adresa ve videopaměti
Přispěvatel: Pako 10. 12. 2016, 21:47:53
Pokud stačí že budeš malovat jenom v okně programu, pak OpenGL. Není to assembler, ale je to základní nízkoúrovňový přistup ke grafické jednotce.
Název: Re:adresa ve videopaměti
Přispěvatel: kvr kvr kvr 10. 12. 2016, 22:46:23
Pristup do framebufferu je možný přes /dev/fb0 (fb1, ...). Nejjednodušší je device otevřít a namapovat do vlastní virtuální paměti procesu.

Viz google, tutorial například https://www.raspberrypi.org/forums/viewtopic.php?t=30720 , případně myslím psal nedávno zde i Pavel Tisnovsky. Bylo na Raspberry, ale debugger je všude stejný (tedy principy a device).
Název: Re:adresa ve videopaměti
Přispěvatel: Jenda 11. 12. 2016, 02:21:22
Můžu se zeptat k čemu takovou věc plánuješ využít?
Název: Re:adresa ve videopaměti
Přispěvatel: Jack Vykrmen 11. 12. 2016, 10:55:36
Tak dík za odpovědi. Já celkem nemám problém pomocí win32 API "namalovat" do okna cokoliv, ale to jde přes tu vrstvu API vnořenou do programu v C++ (můj případ).
Mě šlo o to, zapsat přímo - naprosto primitivně  :P - nějaké číslo do té videopaměti, a hned vidět výsledek. Měl bych z toho dobrý pocit.   :D  Nejde jen o to, aby to obecně šlo- na nějakém prehistorickém PC, protože nemám pro to nějaké praktické odůvodnění. Ale právě jak to udělat na víceméně současném dvoujádru (nebo vícejádru) a win7. Asi by to chtělo toho pana Tišnovského. Protože on by to dovedl pochopit i tak nějak "lidsky", sám určitě ví, co to je ld (16384),a   :)
Název: Re:adresa ve videopaměti
Přispěvatel: Jerry 11. 12. 2016, 11:18:06
poslední OS typu windows, který to podporoval bylo Windows XP. Pak už ne. Pak už MS nasadil
i vlastní kernel ovladač pro grafiku. Pokud to chceš dělat pod WinVista/7/10 pak jedině
prostřednitvím DirectX pro Vista/7 a UWP/DirectX aplikace pro Win10. Vyzkoušet to ale de pod VMWare atd. kde máš puštěný XPčka a starší OS. Podle standardu VESA nastavíš videomod
o daném rozlišení a pak zapisuješ do paměťových bank po 64KB a a přepínáš je od čísla 0 do max.
Přímý zápis do celé video ram bohužel nejde. dělá se to přes paměťové roviny.
Název: Re:Přímý přístup do videopaměti
Přispěvatel: kvr kvr kvr 11. 12. 2016, 17:48:35
Na windos to bude těžší, ale taky: https://msdn.microsoft.com/en-us/library/windows/desktop/bb205896(v=vs.85).aspx

Co se přepínání banků týče, to se používalo u Vesa 1.2 tak před patnácti lety naposledy. Pokud se bavíme o Dosu a Biosu, tak všechny karty ze současného století už umí Vesa 2, která je 32-bit a namapuje celou videopaměť.
Název: Re:Přímý přístup do videopaměti
Přispěvatel: borekz 11. 12. 2016, 18:12:57
V Linux to jde přes directfb, jak tu už nikdo zmínil (/dev/fb0). Ve Windows to šlo řes DirectDraw, naposledy asi ve Windows 9x/Me.
Název: Re:adresa ve videopaměti
Přispěvatel: McFly 11. 12. 2016, 18:40:51
ld (16384),a   :)

To byly časy u assembleru ZX Spectra (já tedy měl jen Didaktik) ;-)
Název: Re:Přímý přístup do videopaměti
Přispěvatel: JmJ 12. 12. 2016, 08:47:15
Jen k tem bankum ve VESA 1.2 - obecne se melo za to, ze bank ma 64KiB, coz ale nemusi byt vzdy pravda. Myslim, ze treba karty matrox mely banky mensi. Pokud si to dobre pamatuju, tak velikost banku se dala nekde vycist a navic jeste slo mit preplnuty jiny bank pro cteni a jiny pro zapis.
Název: Re:Přímý přístup do videopaměti
Přispěvatel: Boo 12. 12. 2016, 09:56:49
V linuxu a Xwin by melo fungovat neco takoveho

Kód: [Vybrat]
printf "\x00\xFF\xFF\x00" | dd bs=4 seek=$((100 * 1024 + 200)) >/dev/fb0

Zapise zluty pixel na pozici x=200, y=100 za predpokladu, ze mas sirku desktopu 1024 pixelu.
Název: Re:Přímý přístup do videopaměti
Přispěvatel: Jerry 12. 12. 2016, 12:56:02
http://collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/articles/DDJ/1995/9513/9513f/9513f.htm