Studna
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 endp

a 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 endp

Bohu₧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:
mail 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