Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem assembler

Ahoj, programuju v Turbo Pascalu 7 kde sem tam používám assembler a mám několik otázek:

1) Jak moc je rychlejší (v režimu VESA 800x600x256) zapisování pixelů přes assembler než přes Mem[...]:=... ?
2) Jak se v tomtéž režimu přenastavují barvy? Našel jsem na to jakousi proceduru ale ta bohužel nefunguje. Jestli se vám to nechce vypisovat tak stačí alespoň naznačit.
3) Jak se v tomtéž režimu nastavuje používání paměti XMS?

Díky

Předmět Autor Datum
1. To predsa zavisi na tom ako to konkretne napises v tom assembleri (nastavis raz segment-register…
MM.. 23.02.2007 15:23
MM..
S VESA módy nad 64 kilo se dá pracovat i v obyčejném real módu, jen si musíš stránkovat video paměť…
JM 23.02.2007 15:55
JM
Dík za rady. Moje adresa je pepa.e@seznam.cz , esi mi něco pošleš tak budu rád.
maherik 23.02.2007 16:15
maherik
I v protect módu je to výhodnější. Ako to moze byt vyhodnejsie ked pises ze int10 je pomaly (a na p…
MM.. 23.02.2007 18:57
MM..
Ve free pascalu použiju linear frame buffer, ale v TP7 16-bitovém PM? Možná že mi něco ušlo, je to p…
JM 23.02.2007 20:15
JM
Aj v 16bitovom mode mozes pouzivat 32bitovy offset. Ja sa teraz nebavim o prekladaci ale o tom co je…
MM.. 24.02.2007 00:00
MM..
EMM386 stránkuje na adresu tuším E00000 a musí se o to žádat (kterej INT to je bych musel dlouho hle…
Rce 24.02.2007 00:30
Rce
On nechce alokovat, potrebuje pristupovat na pevnu adresu, bez EMM386 samozrejme jednoduche (prepnem…
MM.. 24.02.2007 17:39
MM..
Jasně. Když je EMM v paměti, je situace podstatně složitější. V PM sice můžeme adresovat co chceme,…
Rce 24.02.2007 23:40
Rce
Ak uz bezi emm386, tak ti nedovoli pristupovat kam chces, ptz do PM to prepol emm386 a nemozes si uz… poslední
MM.. 25.02.2007 00:58
MM..

1. To predsa zavisi na tom ako to konkretne napises v tom assembleri (nastavis raz segment-register pre viac zapisov, pouzivas instrukciu pre blokovy zapis, apod), najvacsie straty su ale aj tak v pristupe na konkretne pamatove miesto (musi to ist cez relativne pomale zbernice) takze hlavny doraz by som kladol na co najmenej pristupov (pri viacnasobnych operaicach s rovnakym miestom drzat si obsah v registri apod), a pouzivat 32bitove data za predpokladu ze sa meni viac posebe iducich bytov.
P.S: vseobecne ale asm bloky uprostred nejakej funkcie sposobuju compileru vyssich jazykov problemy pri optimalizacii zvysku funkcie, takze celkovo optimalnost vzdy zavisi od konkretneho programu ze co je kde a ako urobene, vseobecne sa daju len tliachat nezmysly...

2. Zmenou palety.
Napr. priamo zavolat VESA BIOS Int10h, napr. AX=4F09h, ak to BIOS konkretnej VGA karty podporuje. Napr. http://pdos.csail.mit.edu/6.828/2006/readings/hardw are/vgadoc/VESA.TXT

3. V popise VESA fcii si najdi slova "linear framebuffer", treba nastavit prislusny bit pri nastavovani VESA modu. Fcia 4F01 ti vrati "Physical address of linear video buffer"
Na to aby si tam vedel pristupovat potrebujes byt v protected mode alebo "big real" mode.

Ak chces robit s VESA modmi najlepsie urobis ak si googlom najdes nejaky slusny popis VESA Int10h volani, alebo nejaku VESA specifikaciu, aby si chapal ze co tvoj program robi.

S VESA módy nad 64 kilo se dá pracovat i v obyčejném real módu, jen si musíš stránkovat video paměť přes INT10 fn4F05. I v protect módu je to výhodnější. Kdysi jsem se v tom dost vrtal. VESA funkce Int10 jsou v PM pomalé, takže udržovat data a používat int jen pokud je to nezbytné.

Jestli chceš nějaké staré zdrojáky, aby ses mohl podívat co to obnáší, řekni kam.

I v protect módu je to výhodnější.

Ako to moze byt vyhodnejsie ked pises ze int10 je pomaly (a na prepnutie stranky potrebujes int10). Ak si v protected mode tak sa daju priamo instrukciou adresovat cele 4GB (edit: samozrejme ak mas selector, t.j. prislusne zadefinovany segment) takze sa da adresovat aj cely framebuffer a netreba pomalym int10h prepinat stranky (samozrejme da sa ale v PM je rychlejsia praca s linearnym framebufferom)

Aj v 16bitovom mode mozes pouzivat 32bitovy offset. Ja sa teraz nebavim o prekladaci ale o tom co je mozne, samozrejme ze prekladac musi vediet prelozit instrukcie s 32bit parametrom (v 16bit kode pomocou prefixu v OPCODE).

Celkovo co mozes v programe robit zavisi ze kto PM zapol. Ak mas beziaci emm386 tak to je trochu problem - musel by si nejako ziadat emm386 aby si vedel kdesi pristupovat, nepamatam uz ako je emm386 rieseny. Ak bol CPU v realnom mode pri starte tak mas plnu kontrolu nad CPU a mozes sa sam prepnut do protected modu a pristupovat kam chces. Aj v 16bit kode. Nastavis si segmenty, ds, esi (mov esi,blabla) a pristupis si kam chces (mov ds:[esi], al alebo ax alebo eax). Prekladac samozrejme tie instrukcie musi vediet prelozit (vie to vacsina aj 16bitovych prekladacov, vcetne masm pre DOS apod.), a musis mat nastavene segmenty v 4GB pamatovom priestore (t.j. si v protected mode alebo v "big real" mode, big real mode je taky ze sa prepnes do protected modu tam sa nastavia 4GB segmenty a prepnes sa nazad do realneho modu, segment limity ostanu 4GB).

EMM386 stránkuje na adresu tuším E00000 a musí se o to žádat (kterej INT to je bych musel dlouho hledat). Je to hrozně složité, ručně bych se do toho nepouštěl. Ta paměť se musí alokovat, přivlastnit a pak zase uvolňovat. O paměť EMS může žádat vícero programů a nesmí se to porvat. Je na to specifikace LIM jak se to má dělat.

On nechce alokovat, potrebuje pristupovat na pevnu adresu, bez EMM386 samozrejme jednoduche (prepnem sa do PM sam), ale ak uz bezi EMM386 (CPU je uz v PM) tak sa to komplikuje, ale musi sa dat aj potom nejako pristupovat na 4GB priestor, zhlavy ale neviem a nechce sa mi to hladat, dotazovatel to aj tak pusta pod Windowsami (ako sme sa dozvedeli z inej otazky) takze mu nejde vobec nic :-D

Jasně. Když je EMM v paměti, je situace podstatně složitější. V PM sice můžeme adresovat co chceme, ale EMM o tom neví a můžeme si navzájem úspěšně přepisovat data. Obvykle je lepší (a modernější - teda ve své době) nepoužívat specifikaci EMS ale XMS a žádat o paměť přímo HIMEM. Tomu jen oznámíme, co jsme si zabrali a on to nebude přidělovat. Když pojede pod Windowsama, je to ještě komplikovanější. Ty používají DPMI a to už se o stejný kus paměti taháme s další správou paměti a je to úplně v pytli :-D.

Ak uz bezi emm386, tak ti nedovoli pristupovat kam chces, ptz do PM to prepol emm386 a nemozes si uz potom robit co chces (privilegovana instrukcia vyvola vynimku atd). Preto je to komplikacia. Malo by sa to dat nejako obist, ale zhlavy neviem ako.

Ak bezi len himem tak je CPU este v realnom mode a do PM sa mozes prepnut kedykolvek a adresovat cokolvek nad 1MB.

Pod Win nemas s DOS programom sancu, vsetko je odchytavane vynimkami CPU a ciastocne emulovane, ciastocne ignorovane (co Win nepovoli). Navyse pod Win je RAM strankovana a swapovana, takze mas logicke adresy a nie fyzicke...

Zpět do poradny Odpovědět na původní otázku Nahoru