![]() |
Studna > ╚lßnky > Runtime Error at ... > RTE 00:05 |
![]()
Runtime Error at 00:05 aneb Fontovßnφ
P°φstup k font∙m
Zßkladem je hranφ si s p°φstupem na porty k videokart∞ a k sekvencΘru. Pokud na port 3c4h a 3ceh jakΘsi hodnoty, u kter²ch ani nevφm, co znamenajφ (to se snad nedß zjistit ani ze sysmana, proto₧e ten popis nechßpu :-))), ale zase vφm co d∞laji. P°epφnajφ p°φstup k fontu a k obrazovce. Tudφ₧ kdy₧ se p°epnu na p°φstup k fontu, od adresy 0a000h je font, kter² mß dΘlku 8192 bytes. Pozor, a zde je jedna zßludnost. V tomto formßtu je ka₧dΘmu pφsmenu vyhrazen prostor 32 bytes, ale standartnφ formßt je dlouh² 4096 bytes (pro ka₧dΘ pφsmeno pouze 16 bytes), tak₧e znak 0 mß definici na prvnφch 16ti bajtech, dalÜφch 16 bajt∙ jsou nesmysly, znak 1 je na dalÜφch 16ti bajtech a po°ßd takhle dßl. Tzn: lich²ch 16 bajt∙ obsahuje definici pφsmena a sud²ch 16 bajt∙ definici nesmyslu. (Pokud tomu nerozumφte, podφvejte se na zdrojßk progrßmku vykradni (je v pascalu).
pro p°φstup k font∙m zavolßme tuto proced∙rku:
seqonx dw 402h,704h gdcon dw 005h,406h,204h facces proc near mov si,offset seqonx mov dx,3c4h outsw outsw mov dl,0ceh outsw outsw outsw ret facces endpa pro nßvrat k normßlnφmu stavu (p°φstup k obrazu) tuto proced∙rku:
seqofx dw 302h,304h gdcoff dw 1005h,0e06h,004h sacces proc near mov si,offset seqofx mov dx,3c4h outsw outsw mov dl,0ceh outsw outsw outsw ret sacces endpBohu₧el, nemohu to blφ₧e vysv∞tlit, sßm jsem m∞l problΘmy vÜe rozchodit, ale napsal jsem vykradaΦ fontu, kter² se spouÜtφ z p°φkazovΘho °ßdku. Napsal jsem ho v asembleru, proto₧e mi to v built-in asembleru pascalu nefungovalo. VykradaΦ ale funguje a vykrßdß cel²ch 8192 bajt∙ fontu, tak₧e se musφ prohnat programem vykradni, aby jsme dostali sprßvn² fontov² soubor o dΘlce 4096 bajt∙. Jmenuje se grabfnt.asm a po komplilaci vytvo°te exe soubor!
Zrovna te∩ m∞ napadlo, ₧e by se s tφm daly d∞lat p∞knΘ v∞ci, jako t°eba nastavovßnφ fontu: m∞l bych soubor dlouh² 8192 bajt∙ s fontem, p°epnul bych se do m≤du p°φstupu na font, nahrßl bych ho na adresu 0a000h a p°epnul bych se zp∞t do m≤du p°φstupu k obrazovce.
2FONTS
Dva fonty v textovΘm re₧imu jsou docela frajerskß v∞c, lidi jenom zφrajφ, jak je to mo₧nΘ. A p°itom to je tak jednoduchΘ. StaΦφ p°epnout p°es porty videokartu, aby p°i ni₧Üφ intenzit∞ pφsma pou₧φvala nult² (primßrnφ) blok fontu a p°i vyÜÜφ intenzit∞ prvnφ (sekundßrnφ) blok fontu. To se za°φdφ takto:
asm mov dx,3c4h mov al,3 mov ah,4 out dx,ax end;Nßvrat k normßlnφmu stylu prßce (ob∞ intenzity pro primßrnφ blok font∙) se provede t∞mito instrukcemi:
asm mov dx,3c4h mov al,3 mov ah,0 out dx,ax end;DalÜφ d∙le₧itou Φinnostφ je nahrßnφ font∙ do p°φsluÜn²ch blok∙ pam∞ti. To se provede pomocφ standartnφ funkce 1100h p°eruÜenφ 10h. Pouze do ni₧Üφho bytu registru bx musφme zadat Φφslo bloku, do kterΘho se mß font nahrßt. To znamenß, ₧e pokud chceme nahrßt font do primßrnφho bloku, zadßme do bl hodnotu 0 a pokud do sekundßrnφho, zadßme hodnotu 1.
VÜe je docela p°ehledn∞ :-)) napsßno ve zdrojßku se jmΘnem 2fonts.pas, tak₧e nemß smysl rozepisovat se o volßnφ int 10h tak podrobn∞.
To by m∞lo b²t vÜe, doufßm, ₧e je to pro vßs n∞co novΘho a budete spokojeni.
kontakt: jislp@feld.cvut.cz http http://cs.felk.cvut.cz/~jislp/ irc kanßly #cs, #cz, #cesi; nick xpj
ZdrojovΘ texty p°φklad∙ (ZIP, 15 kB).
[ Zp∞t nahoru ]
Copyright © 1997, 1998 Pavel Jisl, jislp@feld.cvut.cz