Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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.
-
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.
-
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.
-
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).
-
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.
-
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.
-
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).
-
Můžu se zeptat k čemu takovou věc plánuješ využít?
-
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 :)
-
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.
-
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ěť.
-
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.
-
ld (16384),a :)
To byly časy u assembleru ZX Spectra (já tedy měl jen Didaktik) ;-)
-
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.
-
V linuxu a Xwin by melo fungovat neco takoveho
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.
-
http://collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/articles/DDJ/1995/9513/9513f/9513f.htm