Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!
Vytvořit web zdarmaNa FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!
Vytvořit web zdarmaVtejte v dalm serilu. U pedem Vm mohu slbit, e bude urit del ne vechny pedchoz dly seril dohromady, co Vs jist potilo. Tentokrt to snad nebude tak nudn, jeliko zaneme prvn st multimdi - vizuln strnku. Pokud byste nechtli ekat na tu druhou (zvukovou), mete se podvat na m strnky (www.volny.cz/martinlux), kde najdete nejen spoustu program, kter vyuvaj XMS i grafiku, ale je tam tak titulkovac program (ten mon a od dubna 2006), kter obsahuje obsazen peruen, vlastn funkce na textovou grafiku a klvesnici (take si mete ovit sv znalosti z minula), ale hlavn obsluhu zvukov karty pod DOSem, co by se Vm mohlo lbit.
Naume se postupn od tch nejjednoduch vc, jak v 320x200 a 256 barvch zmnit paletu (a tak jak vytvoit njak ty efekty), pest a rozsvtit pixel, jak udrovat virtuln obrazovku. Pot pejdeme postupn k vym reimm s pepnnm bank-switch (a 1024x768 v True Color barvch (24/32 bit), budeme brt ale i 15/16 bitov), naume se optimalizace, nastavovat logickou dlku dk, pracovat s EMS a XMS pamt, natat obrzky BMP ve vech monch kvalitch a formtech, vytvome si svj vlastn grafick formt podporujc RLE kompresi a prhlednost, a tak formt pro animace vetn komprese. Naume se pevdt barvy mezi HC a TC, a mezi TC a 256 barvami. Ukeme si, jak na 256 barevnm reimu zobrazovat v relnm ase filmy, kter jsou True Colorov. Zjistme, jak se pot prhlednost, prsvitnost a zmna jasu, jak natoit nebo pevrtit obrzek. Mezi jinmi se tak okrajov zmnm o kreslen ar, krunic, tverc a obdelnk, a tak se naume vyplovn. A tak se samozejm naume pracovat s textovmi reimy a ukeme si prci se dvma monitory, pokud jeden z nich je VGA a druh MDA/Hercules. A v ptm serilu se dozvme, jak nae poznatky pevst z TP7 do Free Pascalu, kde vyuijeme i tzv. Linear Frame Buffer, a pozdji jet Direct Draw. Nue, tolik na vod a te se dme do prce...
Na zatek trochu obecnch informac: co se te kd v mch pkladech, tak je pro zjednoduen pi skoro bez kontrol. Ovem pro pln nejlep program je vhodn jej zkompilovat s {$I-} pepnaem a testovat ve pomoc IOResult (nemluv o testech, zda promnn m sprvn obsah). Readln funkce se dnes u nepouvaj, protoe se bhem nich ned dlat nic jinho, take si peteen meze i zadn psmena do sla meme snadno oetit pi pouit funkce Readkey, kter s pomoc Keypressed nezdruje program a meme zatm dlat nco jinho. Vae pklady by mohly vypadat nap. takto:
type SString = string[50]; var Buffer : array[0..2,0..5] of SString; Soubor : file; SkutRW : integer; i : word; p : byte; function UpString(Retez : SString) : SString; var i : byte; begin if Retez[0] <> #0 then for i := 1 to Length(Retez) do Retez[i] := UpCase(Retez[i]); UpString := Retez; end; procedudure Zpracuj(var Neco : array of SString); var i : word; begin for i := Low(Neco) to High(Neco) do {..njak kd..} end; {$I-} begin if ParamStr(1) = '' then Exit; Assign(Soubor,ParamStr(1)); Reset(Soubor,1); if IOResult = 0 then begin i := 0; while not Eof(Soubor) do begin BlockRead(Soubor,Buffer[i],SizeOf(Buffer[i]),SkutRW); if (SkutRW <> SizeOf(Buffer[i])) and not Eof(Soubor) then {chyba!}; for p := 0 to 5 do begin Buffer[i][p] := UpString(Buffer[i,p]); Zpracuj(Buffer[i,p]); end; Inc(i); if i = 3 then Break; end; Close(Soubor); if i = 0 then Exit; {chyba! nic nenateno} end; end;
Doufm, e tento "kratik" kd Vm poskytl alespo njak nastnn, co a kde by se mohlo/mlo kontrolovat. Samozejm meme bt puntiki a kontrolovat kde co, ale ideln se dl jen to, co ns zajm a co znme. Ono se asem nco "podl" dalho, take budeme kontroly stejn pidvat podle toho, na co se n program stane nchylnm. Vhodn ovem je nejen chyby hlsit a pak padat, ale tak se je spe snait automaticky opravovat (tam, kde to jde). A te u konen na hlavn npl:
Asi si kte, e v textu u dneska tm nikdo nepracuje. Nen to pravda. Nejen toti, e textov reim je o dost rychlej a na pam mn nronj ne grafick, a tedy pro jeho provozovn sta i pomalej pota, stle se pouv nap. i v Linuxu a rznch konzolch. Navc, existuj i lep reimy ne 80x25. Pomoc VESA se mete dostat klidn i na 132x60. V takovm rozlien se d u i dobe kreslit (a to nejen pomoc ASCII artu, ale i pomoc plnch znak, nebo jen pomoc mezer s barvou pozad), protoe se jedn o grafick reim 1056x960 (pop. ?x840) a pitom to spotebuje jen 16 kB pamti (dn pepnn bank). Takovto rozlien (132x60) pouvaj navc i nkter LCD displaye u mikropota nebo u mobilnch telefon, take se to hod i pro emulaci (nehled na fakt, e by to samozejm lo emulovat i v grafickm reimu).
Nejprve trocha teorie. Textov md je prvn, ve kterm pota startuje. Jeho video pam je na adrese $b800 a me bt velk a 32 kB. Ve standardnm mdu 80x25 (a prakticky i ve vech ostatnch) se vyuvaj 2 byty na znak (prvn je ASCII kd znaku a druh je atribut, tj. barva poped, barva pozad, blikn), take na celou obrazovku sta jen 4000 byt. Proto vtina karet podporuje tzv. strnky (mohla by to bt obdoba Lixovch nsobnch pracovnch ploch), kde mete mt a nkolik obrazovek a jen mezi nimi pepnte (ani byste je museli mazat a znovu kreslit). Textov reim standardn podporuje 16 barev, tj. 16 barev pro barvu znaku. Pro barvu pozad je standardn jen prvnch 8 barev, protoe nejvy bit z tohoto 4 bitovho daje uruje blikn (nen-li zakzno).
Vjimkou jsou MDA karty a karty Hercules. Jejich textov pam zan na adrese $b000, ale m tak jen 4000 byt na strnku (nkter z nich podporuj jen 1). Opt se pouvaj 2 znaky na atribut, ale vznam atributu je jin. Protoe tyto adaptry um jen 3 barvy od jednoho odstnu (a ten uruje monitor, ne Vy), tak se v atributech nastavuje nco jinho. Bit 7 znamen opt blikn nebo vy intenzitu barvy (u VGA se tam tak uruje nejvy bit pro barvu pozad, pokud je povoleno 16 odstn) pro pozad (tj. pln). Bit 3 nastaven na 1 zvrazn barvu znaku (2x vy intenzita). Pokud jsou ostatn bity 0, je to atribut mezery. Pokud je krom b7 a b3 (kter mohou mt vdy rznou hodnotu) nastaven jen bit 1, bude V znak podtren. Normln znak doclte tak, e prvn ti bity budou vdy 1, ostatn nula (krom 7 a 3, samozejm). A inverzn znak m zase jednikov bity 6-4. Atribut pro barevn znaky probereme pozdji (VGA toti umouje i dva fonty souasn, kdy zase pijdete o 1/2 barev poped). A jinak, textov reim se obvykle zobrazuje v 50 Hz. Videokarta CGA textov reim neum. A pokud se divte, pro probrm takovou zastaralost, je to proto, e i karta VGA um emulovat MDA (reim m slo 7, viz. ATHelp).
Protoe jsme minule odhodili jednotku CRT, mohou nm nyn chybt nkter jej uiten funkce. Nkter z nich meme pepsat pmo do assembleru s vyuitm VGA BIOSu (na DOS nebo obyejn BIOS se meme pedem vykalat). Nebudeme ale schopni dodret pesnou konvenci, pokud si nenapeme i dal funkce. Protoe se nehodlm zabvat pomalmi eenmi, zmnm se o monosti vyut VGA BIOS jen okrajov (jeho pln popis mete najt v AThelpu):
procedure Write(Co : string; Atr : byte); assembler; asm
les di,co mov dx,es:[di] inc di mov ah,9 xor bh,bh mov bl,atr mov cx,1 @pis: mov al,es:[di] int 10h inc di dec dx jnz pis
end;
procedure ClrScr; assembler; asm
mov ax,3 int 10
end;
procedure GotoXY(X,Y : byte); assembler; asm
mov ah,2 xor bh,bh mov dh,y mov dl,x dec dh dec dl int 10h
end;
My se ovem budeme zabvat nm mnohem rychlejm. Nsledujc kdy se daj prakticky pout bez prav (nebo jen s menmi pravami) i ve Free Pascalu (max. tam, kde je kd v Pascalu se mus namsto PORT pout OutPortX nebo InPortX a tam, kde se adresuje v ASM dosov pam (v TP7 vdy) se mus segment+offset slouit do jednoho 20 bitovho daje, hodit do 32 bitovho registru EDI, atd. a pout FS registr jako "segmentov"). Nyn vyuijeme znalosti teorie a udlme si zkladn funkce pro obsluhu textovho reimu. Videopam se d adresovat nsledujcm zpsobem:
var TextMemory : array[1..80,1..25] of record Znak : char; Atr : byte; end absolute $b800:0;
Nm se toto pole bude celkem hodit (jinak bychom museli vyut pkaz MEM), ale pevn jen ve funkci ClrScr. Tak si ale budeme muset definovat dal sv promnn, kter budeme vyuvat:
var X,Y : byte; Barva : byte; Pozadi : byte;
A nyn u meme pistoupit k danm funkcm. Pedpokldm, e k jejich pochopen nejsou zase a tak sloit, take se jist nebudete zlobit, kdy je nebudu popisovat (konstanty typu RED, WHITE, atd. si zkoprujte z npovdy TP7 a nezapomete na jmno BLINK = 128, kter se pouv u TEXTCOLOR). Trochu si doplnme teorii. V barevnch reimem m BYTE atribut toto sloen:
bppp zzzz
var Blikani : boolean; procedure GotoXY(_X,_Y : byte); begin X := _X; Y := _Y; end; function WhereX : byte; begin WhereX := X; end; function WhereY : byte; begin WhereY := Y; end; procedure ClrScr; begin FillChar(Mem[$b800:0],4000,0); {FillChar(TextMemory,SizeOf(TextMemory),0);} end; procedure TextColor(_B : byte); begin Barva := _B; end; procedure TextBackGround(_B : byte); begin Pozadi := _B; end; procedure Write(Co : string); var i : byte; ofs : word; atr : byte; v : byte; begin ofs := (word(Y)*80+X) shl 1; if Blikani then atr := (barva and $8f) or ((pozadi and 7) shl 4) else atr := (barva and $f) or ((pozadi and $f) shl 4); for i := 1 to Length(Co) do begin Mem[$b800:ofs+i shl 1] := Co[i]; Mem[$b800:ofs+i shl 1+1] := Atr; end; V := Ord(Co[0]); Inc(X,Length(Co); {etzec me zabrat i vce ne 1 i 2 dky} while X > 80 do {pokud nechceme pst etzce za sebe, toto meme} begin {klidn odstranit. Pak se bude chovn tto WRITE} if Y < 25 then Inc(Y); {liit od t v Turbo Pascalu} X := (X+V)-80; V := 0; end; end; procedure ZmenBlikani(Stav : boolean); begin Blikani := Stav; asm
mov bl,blikani mov ax,1003h int 10h
end; end;
Vte, nevte, toto je vechna ta magie. Vechno, co se navc nastavuje pes INT 10h, jde nastavit i pes I/O porty karty. Pro se to tak nedl? I kdy je to rychlej, nkter vci (zmna rozlien) tm jdou he a navc u nkterch novjch karet se riskuje, e jejich kompatibilita s VGA nen takov, jak by mla bt. Jejich ovlada (obyejn ASM kd VGA BIOSu naven na INT 10, kter pak pistupuje ke kart pes IO porty) sice podporuje INT 10h, ale sama karta u neemuluje nkter star VGA porty. Ostatn funkce, kter ppadn budete potebovat, si mete dostavt sami (nap. Window nen nic jinho, ne pidn podmnek na oblast do procedury WRITE).
Na zatku jsem se zmnil o monost vce strnek. Tato monost je velmi jednoduch. budeme potebovat proceduru, kter zmn aktivn strnku, proceduru, kter pepne strnku, do kter my budeme pst (nic nm samozejm nebrn, abychom psali do t sam, kter je zrovna aktivn) a jednu promnnou. Bude nutn tak upravit proceduru Write tak, aby potala s monost vce strnek (max. tyi). Kad strnka zan na STR*4000:
var Stranka : byte; {nastavte na zatku na 0} procedure ZmenStranku(_stranka : byte); assembler; asm
mov al,_stranka and al,3 mov stranka,al
end; procedure ZmenAktivni(_stranka : byte); assembler; asm
{na zatku programu je u standardn na 0} mov al,_stranka and al,3 mov ah,5 int 10h
end; procedure Write(Co : string); var i : byte; ofs : word; atr : byte; v : byte; begin ofs := stranka*4000+(word(Y)*80+X) shl 1; if Blikani then atr := (barva and $8f) or ((pozadi and 7) shl 4) else atr := (barva and $f) or ((pozadi and $f) shl 4); for i := 1 to Length(Co) do begin Mem[$b800:ofs+i shl 1] := Co[i]; Mem[$b800:ofs+i shl 1+1] := Atr; end; end; {chyb zde posun souadnic}
Pokud se na to ctte, mete pout monost VGA karty zobrazovat dva fonty souasn. Zavete si jednu novou promnnou (na zatku j dejte na FALSE), dal dv pro typ fontu (nastavte je na zatek na 0 a 1), novou proceduru a upravte jednu stvajc:
var DvaFonty : boolean; KteryFont : byte; Font : array[0..1] of byte; procedure StavFontu(Zapnuto : boolean); begin DvaFonty := Zapnuto; if Zapnuto then asm
mov ax,1103h {viz. ATHelp} les di,font mov bl,es:[di] inc di mov bh,es:[di] shl bh,2 or bl,bh int 10h
end else asm
mov ax,3+128 {resetujeme nastaven} int 10h {ale nevymaeme obrazovku!}
end; end; procedure TextFont(Druhy : boolean); begin KteryFont := Ord(Druhy); end; procedure SetFont(Ktery,Typ : byte); {vybereme typ fontu} begin {mme 2 banky, pro kad 1 ze 4 typ} Ktery := Ktery and 1; Typ := Typ and 3; Font[Ktery] := Typ; end; procedure Write(Co : string); var i : byte; ofs : word; atr : byte; begin ofs := stranka*4000+(word(Y)*80+X) shl 1; case DvaFonty of False : if Blikani then atr := (barva and $8f) or ((pozadi and 7) shl 4) else atr := (barva and $f) or ((pozadi and $f) shl 4); True : if Blikani then atr := (barva and $87) or ((pozadi and 7) shl 4) or (kteryfont shl 3) else atr := (barva and $7) or ((pozadi and $f) shl 4) or (kteryfont shl 3); end; for i := 1 to Length(Co) do begin Mem[$b800:ofs+i shl 1] := Co[i]; Mem[$b800:ofs+i shl 1+1] := Atr; end; end;
Dan fonty si mete do pamti nahrt pes funkce na INT $10. Protoe jsou popsan v ATHelpu a protoe tuto monost zmiuji jen jako bonus (zase tak moc asto ji urite pouvat nebudete, kdy potebujete 512 rznch znak? Pokud na nco ano, jist jste tak daleko, e v textovm reimu provdte mnohem lep vci ne jen snahy o vmnu font), nebudu se o tom dle zmiovat. Snad jen poznmka na konec: vechno, co jsme doposud dlali, bylo ureno pro reim 80x25 v 16 barvch (ty mete zmnit, ale narozdl od 256 barev je to ponkud sloitj: vlote index barvy do BL a volte funkci $1007 (samozejm na INT 10h); pak hodnotu BH ulome do BL a BH vynulujeme, do AX dme 1010h, a do CH,CL,DH ulome G,B,R hodnoty barvy (vznam m jen dolnch 6 bit) a volme INT 10h). Pod slem 1 mte reim 40x25 a pod reimem 7 je MDA. Je proto vhodn si zavst promnnou a namsto pevnho sla 3 do AX vkldat tuto promnnou, aby Vm program fungoval ve vech reimech (je samozejm tak nutn upravit funkci WRITE, kde sta jen zmnit vpoet offsetu (pop. jet atributu pro MDA - ostatn funkce mete ponechat, snad krom GOTOXY, pokud mnte "rozlien"), ve ostatn pijde "jaksi samo"). Pokud byste chtli jin reimy, muste u pouvat VESA funkce. Ty budeme rozebrat v grafickm reimu, take jen uku, jak se inicializuj (bez njakch kontrol). Vechny reimy maj jen 16 barev a jsou to tyto sla: $108 (80x60), $109 (1320x25), $10A (132x43), $10C (132x50) a $10D (132x60); samozejm spotebuj tak vce pamti VRAM (X*Y*2):
function VESA(rezim : word); assembler; asm
mov ax,$4f02 mov bx,rezim int 10h
end;
Pokud ale nechcete vyuvat VESA reimy, uki Vm nco, co by mlo fungovat na vech (VGA kompatibilnch) grafickch kartch. Mon si nkte z Vs vzpomnte, e nap. M602 dokzal zobrazovat (a nejen on, teba i Turbo Pascal IDE) ne jen na 25 dcch, ale i na 50. Jak se to dl? K tto innosti potebujeme znt nco o I/O portech grafick karty (doporuuji AThelp). Ns budou zajmat hlavn CRT registry. Nejprve trocha t teorie. Porty jsou ve dvojicch, na prvn zapete slo registru, kter chcete st, a ze druhho petete jeho hodnotu, pop. j do nj zapete. Protoe jsou porty hned za sebou, je mon pi zpisu namsto posln 2xBYTE poslat 1xWORD, kter se pole do obou port souasn (resp. postupn). Pokud chcete ale st, muste to provst nadvakrt a navc s mrnm spodnm. Je tak dobr vdt, e pokud chcete zmnit nkter bit, nemete zapsat jen jeho hodnotu do bytu a ten pak poslat, protoe bychom tm zmnili i hodnoty ostatnch bit, a to nechceme! J jsem si pvodn myslel, e se tyto reimy nastav v registru 17 bitem 2, ale kdy jsem psal proceduru, tak jsem sice nastavil bit 2, ale v registru 9 (chyba) a ono to tak njak fungovalo. Inu, dj se divn vci. Tak tedy zaneme prvn procedurou, kter dl pesn to opan, co nechceme. Take namsto 25 dk dostaneme dk 12:
procedure PolovicniPocet; assembler; asm
mov al,9 {CRT registr slo 9} mov dx,$3d4 {vbr CRT portu} out dx,al {poleme slo registr} inc dx jmp @spozd @spozd: in al,dx {peteme pvodn stav z dalho portu} mov ah,al mov al,9 or ah,128 {nastavme bit 7, tedy dvojit mikrodkovn} dec dx out dx,ax
end;
To je sice pkn efekt, ale asi to nen to, co hledme (jinak je to obdoba reimu 40x25, jene my jsme si udlali 80x12). J jsem ale bhem pokus a omyl piel na jeden zajmav trik. Zjednodume si horn proceduru
procedure ZmenaMikroRadku(Lines : byte); assembler; asm
mov al,9 mov ah,lines add ah,128 dec dx out dx,ax
end;
Pokud nastavte 7 mikrodk jako parametr, dostanete standardn 80x25. Pokud dte teba 8, dostanete 80x22. Pi 9 to bude u 80x19. Dan slo toti znamen poet mikrodk na jeden znak. Tj. logicky, m vy slo, tm mn dk na obrazovce. Pokud nastavte vce, tak ve Windows dostanete vce dk, ale ve Full Screen nebudou zobrazeny cel znaky. Protoe bit7 je standardn 0, zkusme jej tak "odstranit":
procedure ZmenaMikroRadku(Lines : byte); assembler; asm
mov al,9 mov ah,lines dec dx out dx,ax
end;
Bum bc! Kdy si te nastavte 7 mikrodk, dostanete 80x50! Jedin problm je v tom, e standardn procedury Write nebo Writeln pracuj stle jen v dcch 1-25, jakoby bylo nastaven Window. Pomoc funkce MEM se ale meme dostat kamkoliv. Nap. Mem[$b800:49*80*2] := Ord('X') zape znak X na prvn znak poslednho dku. Ale pokud pepneme do Full Screen, tak zase nevidme vechny mikrodky. Vidme jen 1/2 psmen a zase navc v rozlien 80x25. Abychom to srovnali, musme dt poet dk 14, ale to jsme zase tam, kde jsme byli ped tm. Mon, e je to vina Windows nebo karty, kdo v. Mon by stailo jen zmnit font z 8x14 na 8x8 (viz. ATHelp) a dostali bychom o 50% vce dk s normlnm textem (namsto 14 mikrolinek by stailo jen 8). Inu, tady u legrace kon. Pro jednou nm to nevylo :-). Zkusme tedy, jestli nm nepome VGA BIOS. Zd se, e ano. Njak funkce na INT 10h zd se jsou. Ale ty u bohuel v ATHelpu nenajdete. Doporuuji se podvat na Internet, nap. na:
http://www.cs.cmu.edu/afs/cs/user/ralf/pub/WWW/files.html
procedure _50lines; assembler; asm
mov ax,1202h mov bl,30h int 10h mov ax,1112h xor bl,bl int 10h
end;
A vechny ty hrzy, co jsme dote napchali, odstrante (resp. se pepnete zpt do 80x25) pomoc inicializace textovho mdu. Pokud pitom nechcete mazat obrazovku, napite to takto:
procedure _25lines; assembler; asm
mov ax,83h int 10h
end;
Na zvr jet jedna perlika, kter se d (vtinou) pout i v grafickch reimech a nkdy i pod Windows (ale jen ve sputn DOSov aplikace). Nap. jako spoi monitoru. Jednodue vypnete zobrazovn pamti VRAM (pst do n ovem mete dl):
procedure Zobrazovani(Aktivni : boolean); assembler; asm
mov ah,12h mov al,aktivni mov bl,36h int 10h
end;
No, a to je z textovho reimu vechno. Na co se dneska asi tak hod? Bu na prvotn vpisy, ne se V program hod do grafiky, na pamov nenron a rychl aplikace, atd. Mete si tento reim jet vylepit tak, e si zavedete tzv. VVRAM, nebo-li virtuln video RAM. Jedn se defakto o nco jako Page Flipping ve Windows. Z definice TextMemory smate ve co se tk ABSOLUTE a funkce Write a ClrScr realizujte zpisem do tto pamti. Protoe RAM je mnohem rychlej ne VRAM (nemluv o jejm ten), mete takto urychlit vykreslovn (nehled na synchronizaci se zptnm bhem, o kterm se tak zmnmme u grafiky). A ve vykreslte, pesune cel blok do VRAM pomoc instrukce:
Move(TextMemory,Mem[$b800:stranka*4000],SizeOf(TextMemory)).Ale o tomto se budeme zmiovat pozdji v grafickch operacch, take pokud Vs to zajm, pokraujte ve ten tohoto lnku... Jet ale ne zavtme do grafiky, ekneme si jak vyut dva monitory. Je to dost star zleitost, take pokud nemte nkde star Hercules, mete na to zapomenout (samozejm, e je mon, abyste pouvali 2 VGA karty ISA (kde mete pout jejich I/O porty) nebo PCI (i AGP a PCI, kde u to nen tak jednoduch) jak v relnm, tak chrnnm reimu, ale to u nen takov legrace - je to toti docela sloit. Muste hlavn zkoprovat BIOS jedn karty jinam a volat jeho funkce pmo a ne pes INT 10h, kde sdl jen a pouze primrn karta; pokud mte v systmu primrn kartu AGP a sekundrn PCI, doporuuji se podvat na strnky www.asm32.com, kde mte k dispozici ovlada (bohuel shareware), kter z PCI karty udl jakoby MDA - dl se to tak, e zmnte jeden bit v North Bridge, take most pak pesmrovv pstup do pamti $b000 a nkter porty na kartu PCI namsto na kartu AGP - ono je to samozejm o trochu sloitj).
Cel je to vlastn velice primitivn. VGA karta se bude v systmu chovat jako primrn, tedy na n uvidte MS-DOS, hry, budete moci pouvat jej textov reim ($b800) i grafiku ($a000), funkce LFB, INT 10h, BS. Sekundrn karta (v tomto ppad Hercules) by mla bt BIOSem inicializovna do textovho reimu. A to je tak to jedin, co potebujete (pokud chcete grafiku, tak si muste s kartou popovdat pes I/O porty). Jej pam je Vm nyn pstupn na $b000, take cokoliv tam zapete se ihned zobraz. Zjistit, kter karty mte v systmu se d pes funkci $1a00 na peruen $10, kde se Vm v BL a BH vrt aktivn a neaktivn systm. Ideln by ml mt registr BX hodnotu $0108. Pro vce informac viz. ATHelp, nebo se tak mete podvat na m strnky, kde je spousta program tkajcch se prce (nejen) v textovch reimech (a to i tehdy, pokud program pracuje i s grafikou).
POKRAOVN P͊T V GRAFICKM REIMU...