A 2.0.0 kernelről szólok. 1.2.13 kernel forrásom most nincs, ezért nem tudom megnézni, hogy ott mi a helyzet. A lényeg ott is megvan, de valószínű, hogy kevésbé unicode-os a megvalósítás. Szóval 95. február 10. óta:
Tételezzük fel, hogy az eredeti VGA fontot használjuk.
Beállíthatunk saját ,,output mapping tablat'' a ,,mapscrn'' paranccsal. Ez egy 256 karakterből álló tábla. Ha kiírok egy karaktert, legyen i, a videómemóriába a map[i] kerül.
Ez a mapping az ESC(K string kiírásával aktiválható. (echo -e '\033(K')
Vannak default mappingok is, ezek a megfelelő karakterkészletet próbálják megjeleníteni a VGA ROM fonttal (más néven ibm437).
$ | echo | -e | '\033(B' | # | Latin1 (ez a default) |
$ | echo | -e | '\033(0' | # | VT100 pszeudografika |
$ | echo | -e | '\033(U' | # | VGA ROM |
$ | echo | -e | '\033(K' | # | A saját beállításunk |
Régen ezek ,,bedrótozott'' mappingok voltak, a kernel mindig azt feltételezte, hogy ibm437 fonttal dolgozunk. Azóta unicodosították, és ha az eredetitől eltérő kiosztású fontot használunk, egy unicode értelmező táblát csatolhatunk hozzá, amiben leírjuk, hogy az egyes karakterek micsodák is tulajdonképpen. Ezt a ,,loadunimap'' tölti be, de ,,psfaddtable'' -val a fonthoz is csatolható.
Így már készülhetnek olyan fontok, mint a lat1u-16.psf vagy ez a font is, hogy szabványos is, meg blokkgrafika is van benne, és a ,,bal alsó sarok'' karakter kódja a videóram-ban c0..df között van, hogy szépen nézzen ki, de a 0x83 karakter kiírásánal látszik, mert ott volt neki hely.
Viszont ha ESC(U-val ibm437 kódlapra kapcsolok, a kernel az unicode tábla alapján megkeresi, és máris 0xc0-nak látszik, így a DOS-os ascii-art-ok, vagy más doksik - ha nem is tökéletesen - de olvashatóak, új font betöltése nélkül. Természetesen a Midnight Commander is megtalálja a unicode tábla alapján, vagyis az is normálisan néz ki.
Igazándibol nekem ez a 61 MHz (az eredeti 28.3 helyett) text mode órajel miatt fontos, mert itt egy kicsit bonyolultabb egy font betöltése. (SVGATextMode)
Nemcsak egyszerű ,,char map[256]'' output map definiálható, hanem ,,unsigned short unimap[256]'' is, amivel az ESC(K -val előhívható saját map-ban nem a karakter fontbeli sorszámára hivatkozunk (ki tudja mi van ott?), hanem a unicodjára, ezt a kernel majd elintézi, hogy azt lássuk ott.
A legjobb megoldás ezek szerint az 512 karakteres font (olyan is lehet), Latin-1 + Latin-2 + ibm437 + vt100 karakterekkel, hozzávaló értelmező unicode táblával, Latin-2 output unicode táblával = tetszőlegesen, futási időben változtatható karakterkészlet. Már csinálom. :)