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

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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
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..

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