TAKI NIBY BLOG
|
Krótka historia polskich liter w Turbo Pascalu
|
|
Tekst na temat dołączania na VGA
polskich liter do programów TURBO
Pascalowych.
dla PC-Kurier
HIERARCHIA TEKSTU
Listing proc VGA_POL
Listing przykładu VGA_POL
Listing proc PLGRAPH
Listing przykładu PLGRAPH
List wiodący
Romuald J. Żyłła Łódź 3.11.92
ul. ......... 12 B m.22
91-058 ŁÓDŹ
Redakcja PC-Kurier
ul. Stępińska 22/30
00-739 Warszawa
Proszę o zamieszczenie w dziale Dla praktyków: Turbo Pascal
załączonego artykułu pod tytułem 'Polskie litery w programach
Pascalowych'.
Dla ułatwienia pracy redakcyjnej dołączam jeden egzemplarz
w postaci drukowanej oraz na dyskietce w formacie edytora TAG
wersja 2.04.
1) Upoważniam Redakcję do korekty stylistycznej tekstu.
2) Upoważniam Redakcję do sensownego rozbicia tekstu na dwie
części drukowane w dwóch kolejnych numerach PC-Kuriera.
Zdaję sobie sprawę z długości wydruków jednak nie chciałbym
aby ukazał się sam tekst bez wydruków procedur.
3) Upoważniam Redakcję do zamieszczenia załączonych listingów
programów i procedur na przygotowywanej przez PC-Kurier
dyskietce z drukowanymi materiałami.
Romuald Żyłła
Polskie litery w programach Pascalowych.
Romuald Żyłła
Problem stary jak PC-Kurier. Pisząc nawet małe programy w
Turbo Pascalu stajemy przed kilkoma decyzjami. Jeśli piszemy dla
siebie możemy zaniedbać elegancję i pozostawić program bez
polskich znaków. W przeciwnym wypadku należy się zdecydować na
jeden z kilku standardów albo zaprogramować wszystkie z nich.
Wraz z wejściem DOSa 5.0 możnaby zdecydować się na Latin-2.
Jeśli mamy kartę VGA to problem byłby rozwiązany bo program
DISPLAY.SYS zajmuje tylko 8KB pamięci RAM i ładnie wytrzymuje
kolejne przełączenia trybów pracy karty - czego nie można
powiedzieć o większości pisanych u nas programików do
definiowania polskich liter na VGA. Niestety standard Latin-2
psuje nam rozmaite symbole ramkowe i wiele ślicznych programów
zaczyna wyglądać jak śmietnik. NB proponuję aby PC-Kurier zrobił
ankietę na temat jaki procent użytkowników DOSa 5 wybiera kody
Latin2. Programista pisząc program dla kogoś niestety nie wie
jaki będzie DOS, Code Page lub karta grafiki w komputerze
docelowym. Program musi sam przestawić się odpowiednio do
sytuacji.
Oprócz wyboru standardu kodowania (Mazovia kontra Latin-2)
pozostaje decyzja: praca w trybie graficznym czy tekstowym.
W przypadku programowania w Turbo-pascalu standardowe fonty *.CHR
nie zawierają polskich liter, musimy więc zakupić przerobione
fonty w firmie XXXXXX. Jeśli się zdecydujemy, że nie musimy mieć
skalowalnych krojów to można się posłużyć fontem tzw. default o
numerze zero, który ma wymiar 8x8 pikseli. Krój ten składa się
ze znaków o kodach od 0 do 127 i jest zapisany w każdym BIOSie
od adresu $FFA6E oraz z części ładowalnej programowo w dowolne
miejsce pamięci. Ten drugi kawałek jest ładowany programem DOS-a
GRAFTABL.COM, jest dostępny przez przerwanie $1F, i standardowo
zawiera litery o kodach 128 do 255, tzn. litery różnych języków
z wyjątkiem polskiego. Oczywiście na własnym komputerze można na
stałe zmodyfikować GRAFTABL.COM i wmontować w niego polskie
litery. Jeśli natomiast chcemy napisać program dla kogoś to nie
możemy go zmuszać do pamiętania o takich drobiazgach jak
ładowanie do pamięci GRAFTABL.COM zawsze przed używaniem naszego
programu. We własnych programach pascalowych można temu zaradzić
stosując UNIT pod nazwą POLGRAPH przedstawiony na Wydruku 1,
program demonstracyjny pokazano na Wydruku 2. Zastosowanie tego
modułu obciąża program EXE tylko o 1 KB.
Mimo wzrostu znaczenia Graphic User Interface (GUI), takich
jak Windows i wielu innych, przez jakiś czas programy pisane
przez zwykłych ludzi, amatorów i naukowców będą się posługiwać
trybem tekstowym. Przy powszechnym już stosowaniu kart VGA można
także nieprofesjonalistom ułatwić posługiwanie się językiem
polskim, a nie polskawym. Dla przykładu powiem, że przedstawiony
moduł jest fragmentem programu do testowania wiedzy studentów
lub kursantów z dowolnej dziedziny, w której pytania można
zadawać w języku polskim bez posługiwania się rysunkami lub
niełacińskim alfabetem. W najprostszym przypadku są to pytania
na temat programowania w Pascalu, DBase, Lotus lub DOSa. W
takich zastosowaniach jest oczywiste, że jeśli tylko sprzęt na
to pozwala, treść pytań powinna być jak najbardziej zrozumiała.
Zadany kat nie może być mylony z żądanym kątem. Student i tak
jest w stresie.
Nie zamierzam robić wykładu z programowania karty EGA/VGA,
(piękna książka na ten temat kosztuje ok. 700 tys. zł, jeśli
PC-Kurier zapłaci za ten artykulik to sobie ją kupię) wystarczy
że powiem, że w VGA-ROM-BIOS zawarte są kroje liter o wymiarach
8x8, 14x8 i 16x8 pikseli. Poza tym każdy z tych krojów może być
podmieniony przez wskazaną przez nasz program tablicę z krojem.
Co ciekawsze można podmienić, a raczej wskazać BIOSowi tylko
fragment własnej tablicy znaków. W ten sposób oszczędza się
pamięć, bo np. dla Mazovii podaje się tylko definicje znaków o
kodach od 134 do 168. Reszta jest niezmieniona i siedzi sobie w
ROMie.
Przy stosowaniu przedstawionej procedury POLISH należy
zwrócić uwagę na fakt, że karta VGA zapomina o przedefiniowanych
krojach liter po każdej zmianie trybu pracy. Dla przykładu
przejście do trybu graficznego i powrót do tekstowego likwiduje
polskie znaki, podobnie jak przejście do trybu 40x25 znaków lub
do trybu 80x43. Dlatego zawsze po zmianie trybu pracy należy
wywołać procedurę POLISH. W jej wnętrzu zawarte jest testowanie
nowego trybu pracy i odpowiednie wskazanie na jedną z tablic
krojów.
Część inicjalizacyjna modułu przedstawiona na Wydruku 3
zawiera tylko test obecności karty EGA/VGA, który ustawia
zmienną Boolowską NO_EGA w stan FALSE lub TRUE. W zależności od
stanu tej zmiennej funkcja typu string o nazwie ASCII dokonuje
wymian znaków polskich na ich odpowiedniki łacińskie (litery bez
ogonków). Taki sposób pracy pozwala na stosowanie tego samego
programu w sieci Novell złożonej z PeCetów z różnymi kartami
graficznymi. Na kartach CGA lub Hercules ukazują się napisy bez
ogonków i bez denerwujących "krzaków", natomiast na VGA napisy z
pięknymi polskimi literami.
W przypadku pisania programu dla klienta, który posiada
Herculesy z polskimi ROMami należałoby - jeśli moduł wykrył brak
karty EGA lub VGA - wprowadzić na początku programu (nie w
module VGA_POL) pytanie: czy karta Hercules ma wbudowane polskie
znaki - jeśli tak to zmienną NO_EGA ustawić na FALSE, wtedy
funkcja ASCII będzie z siebie wydawać polskie znaki.
W przykładzie stosowania modułu i procedury POLISH na
Wydruku 4 pokazano jak przez deklarację procedury friteln można
skrócić program, jeśli trzeba w nim produkować dużą liczbę napisów.
Należy wtedy zamiast procedury writeln stosować procedurę friteln.
Na koniec pytanie dla wszystkich Certified Novell Engineers:
dlaczego jeśli komputer z kartą VGA jest podłączony w
sieci Novell (dla przykładu wersja 3.11 i karty ARCNET)
wywołanie funkcji VIDEO BIOSa
R.AX:=$1200; R.BL:=$32; Intr( $10, R );
zawiesza komunikację końcówki z siecią?
Według dokumentacji powinno tylko robić "enable video".
dla fachowców od Pascala:
dlaczego moduł CRT w TURBO Pascalu nie pozwala na pracę w
trybie tekstowym 132 znaków na ekranie ?
a dokładniej: dlaczego część inicjalizacyjna modułu CRT
przełącza kartę z pracy w trybie 132 znaki na 80 znaków ?
Wydruk 1
UNIT POLGRAPH; {autor: Romuald J. Żyłła }
{ ZYLLAROM @ PLEARN.BITNET }
INTERFACE uses CRT, DOS;
type kilobyte = array[0..1023] of byte;
var graftable : kilobyte;
IMPLEMENTATION
const
datgraftable : kilobyte =
($3C,$66,$60,$66,$3C,$0C,$06,$3C, $00,$66,$00,$66,$66,$66,$3F,$00, { 129 }
$0E,$00,$3C,$66,$7E,$60,$3C,$00, $7E,$C3,$3C,$06,$3E,$66,$3F,$00, { 131 }
$66,$00,$3C,$06,$3E,$66,$3F,$00, $70,$00,$3C,$06,$3E,$66,$3F,$00, { 133 }
$00,$00,$78,$0C,$7C,$CC,$76,$0C, $00,$00,$3C,$60,$60,$3C,$06,$1C, { 135 }
$7E,$C3,$3C,$66,$7E,$60,$3C,$00, $66,$00,$3C,$66,$7E,$60,$3C,$00, { 137 }
$70,$00,$3C,$66,$7E,$60,$3C,$00, $66,$00,$38,$18,$18,$18,$3C,$00, { 139 }
$7C,$C6,$38,$18,$18,$18,$3C,$00, $18,$30,$78,$CC,$C0,$CC,$78,$00, { 141 }
$63,$1C,$36,$63,$7F,$63,$63,$00, $30,$78,$CC,$CC,$FC,$CC,$CC,$18, { 143 }
$FE,$62,$68,$78,$68,$62,$FE,$0C, $00,$00,$78,$CC,$FC,$C0,$78,$30, { 145 }
$70,$3C,$38,$70,$F0,$30,$78,$00, $3C,$66,$00,$3C,$66,$66,$3C,$00, { 147 }
$00,$66,$00,$3C,$66,$66,$3C,$00, $18,$3C,$66,$C0,$C0,$C0,$66,$3C, { 149 }
$3C,$66,$00,$66,$66,$66,$3F,$00, $00,$70,$00,$66,$66,$66,$3F,$00, { 151 }
$30,$78,$CC,$E0,$38,$1C,$CC,$78, $C3,$18,$3C,$66,$66,$3C,$18,$00, { 153 }
$66,$00,$66,$66,$66,$66,$3C,$00, $18,$18,$7E,$C0,$C0,$7E,$18,$18, { 155 }
$F0,$64,$6C,$7C,$E2,$66,$FE,$00, $66,$66,$3C,$7E,$18,$7E,$18,$18, { 157 }
$0C,$18,$7C,$C0,$78,$0C,$F8,$00, $0E,$1B,$18,$3C,$18,$18,$D8,$70, { 159 }
$38,$FE,$C6,$8C,$18,$32,$66,$FE, $FE,$C6,$0C,$7E,$30,$66,$FE,$00, { 161 }
$18,$30,$78,$CC,$CC,$CC,$78,$00, $18,$38,$6C,$C6,$C6,$C6,$6C,$38, { 163 }
$18,$30,$F8,$CC,$CC,$CC,$CC,$00, $38,$C6,$E6,$F6,$DE,$C6,$C6,$C6, { 165 }
$18,$30,$FC,$98,$30,$64,$FC,$00, $00,$00,$FC,$18,$FC,$60,$FC,$00, { 167 }
$18,$30,$60,$60,$60,$30,$18,$00, $00,$00,$00,$7E,$60,$60,$00,$00, { 169 }
$00,$00,$00,$7E,$06,$06,$00,$00, $C3,$C6,$CC,$DE,$33,$66,$CC,$0F, { 171 }
$C3,$C6,$CC,$DB,$37,$6F,$CF,$03, $18,$18,$00,$18,$18,$18,$18,$00, { 173 }
$00,$33,$66,$CC,$66,$33,$00,$00, $00,$CC,$66,$33,$66,$CC,$00,$00, { 175 }
$22,$88,$22,$88,$22,$88,$22,$88, $55,$AA,$55,$AA,$55,$AA,$55,$AA, { 177 }
$DB,$77,$DB,$EE,$DB,$77,$DB,$EE, $18,$18,$18,$18,$18,$18,$18,$18, { 179 }
$18,$18,$18,$18,$F8,$18,$18,$18, $18,$18,$F8,$18,$F8,$18,$18,$18, { 181 }
$36,$36,$36,$36,$F6,$36,$36,$36, $00,$00,$00,$00,$FE,$36,$36,$36, { 183 }
$00,$00,$F8,$18,$F8,$18,$18,$18, $36,$36,$F6,$06,$F6,$36,$36,$36, { 185 }
$36,$36,$36,$36,$36,$36,$36,$36, $00,$00,$FE,$06,$F6,$36,$36,$36, { 187 }
$36,$36,$F6,$06,$FE,$00,$00,$00, $36,$36,$36,$36,$FE,$00,$00,$00, { 189 }
$18,$18,$F8,$18,$F8,$00,$00,$00, $00,$00,$00,$00,$F8,$18,$18,$18, { 191 }
$18,$18,$18,$18,$1F,$00,$00,$00, $18,$18,$18,$18,$FF,$00,$00,$00, { 193 }
$00,$00,$00,$00,$FF,$18,$18,$18, $18,$18,$18,$18,$1F,$18,$18,$18, { 195 }
$00,$00,$00,$00,$FF,$00,$00,$00, $18,$18,$18,$18,$FF,$18,$18,$18, { 197 }
$18,$18,$1F,$18,$1F,$18,$18,$18, $36,$36,$36,$36,$37,$36,$36,$36, { 199 }
$36,$36,$37,$30,$3F,$00,$00,$00, $00,$00,$3F,$30,$37,$36,$36,$36, { 201 }
$36,$36,$F7,$00,$FF,$00,$00,$00, $00,$00,$FF,$00,$F7,$36,$36,$36, { 203 }
$36,$36,$37,$30,$37,$36,$36,$36, $00,$00,$FF,$00,$FF,$00,$00,$00, { 205 }
$36,$36,$F7,$00,$F7,$36,$36,$36, $18,$18,$FF,$00,$FF,$00,$00,$00, { 207 }
$36,$36,$36,$36,$FF,$00,$00,$00, $00,$00,$FF,$00,$FF,$18,$18,$18, { 209 }
$00,$00,$00,$00,$FF,$36,$36,$36, $36,$36,$36,$36,$3F,$00,$00,$00, { 211 }
$18,$18,$1F,$18,$1F,$00,$00,$00, $00,$00,$1F,$18,$1F,$18,$18,$18, { 213 }
$00,$00,$00,$00,$3F,$36,$36,$36, $36,$36,$36,$36,$FF,$36,$36,$36, { 215 }
$18,$18,$FF,$18,$FF,$18,$18,$18, $18,$18,$18,$18,$F8,$00,$00,$00, { 217 }
$00,$00,$00,$00,$1F,$18,$18,$18, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, { 219 }
$00,$00,$00,$00,$FF,$FF,$FF,$FF, $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0, { 221 }
$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F, $FF,$FF,$FF,$FF,$00,$00,$00,$00, { 223 }
$00,$00,$3B,$6E,$64,$6E,$3B,$00, $00,$3C,$66,$7C,$66,$7C,$60,$60, { 225 }
$00,$7E,$66,$60,$60,$60,$60,$00, $00,$7F,$36,$36,$36,$36,$36,$00, { 227 }
$7E,$66,$30,$18,$30,$66,$7E,$00, $00,$00,$3F,$6C,$6C,$6C,$38,$00, { 229 }
$00,$33,$33,$33,$33,$3E,$30,$60, $00,$3B,$6E,$0C,$0C,$0C,$0C,$00, { 231 }
$7E,$18,$3C,$66,$66,$3C,$18,$7E, $1C,$36,$63,$7F,$63,$36,$1C,$00, { 233 }
$1C,$36,$63,$63,$36,$36,$77,$00, $0E,$18,$0C,$3E,$66,$66,$3C,$00, { 235 }
$00,$00,$7E,$DB,$DB,$7E,$00,$00, $06,$0C,$7E,$DB,$DB,$7E,$60,$C0, { 237 }
$1C,$60,$C0,$FC,$C0,$60,$1C,$00, $3C,$66,$66,$66,$66,$66,$66,$00, { 239 }
$00,$7E,$00,$7E,$00,$7E,$00,$00, $18,$18,$7E,$18,$18,$00,$7E,$00, { 241 }
$30,$18,$0C,$18,$30,$00,$7E,$00, $0C,$18,$30,$18,$0C,$00,$7E,$00, { 243 }
$0E,$1B,$1B,$18,$18,$18,$18,$18, $18,$18,$18,$18,$18,$D8,$D8,$70, { 245 }
$18,$18,$00,$7E,$00,$18,$18,$00, $00,$76,$DC,$00,$76,$DC,$00,$00, { 247 }
$38,$6C,$6C,$38,$00,$00,$00,$00, $00,$00,$00,$18,$18,$00,$00,$00, { 249 }
$00,$00,$00,$00,$18,$00,$00,$00, $0F,$0C,$0C,$0C,$EC,$6C,$3C,$1C, { 251 }
$78,$6C,$6C,$6C,$6C,$00,$00,$00, $70,$18,$30,$60,$78,$00,$00,$00, { 253 }
$00,$00,$3C,$3C,$3C,$3C,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00);{ 255 }
begin { unit PolGraph }
GrafTable:=DatGrafTable;
{ instrukcja przywrócenia wektorów nie jest potrzebna bo Turbo
Pascal po skończeniu programu przywraca oryginalne przerwania }
end. { unit PolGraph }
Wydruk 2
uses DOS, GRAPH, POLGRAPH;
var Gd, Gm : Integer;
Radius : Integer;
begin
Gd := Detect; InitGraph(Gd, Gm, 'C:\turbo55');
if GraphResult <> grOk then Halt(1);
SetIntVec( $1F, addr(GrafTable) ); Circle(100, 100, 50);
OutTextXY(100, 95,'środek koła');
OutTextXY(150,110,'promień okręgu');
ReadLn;
CloseGraph;
end.
Wydruk 3
unit VGA_POL; { autor: Romuald J. Żyłła }
{ ZYLLAROM @ PLEARN.BITNET }
INTERFACE uses CRT, DOS;
function VGA : Boolean;
var NO_EGA : Boolean;
GPOINT : pointer;
const
zamien : array[134..167] of char
= 'a'#135#136#137#138#139#140'c'#142'AEel'+
#147#148'C'#150#151'S'#153#154#155'L'#157's'+
#159'ZZ'#162'OnNzz';
procedure Polish;
procedure VideoMode( m : byte );
procedure Wait4TakNie( var ch : char );
function Wait4oneFrom( aaa : PathStr ) : char;
function ASCII( sss : string ): string;
IMPLEMENTATION
var R : Registers;
function VGA: Boolean; { $32 zawiesza NOVELLA ??? }
begin R.AX:=$1201; R.BL:=$33;
Intr( $10, R ); VGA := (R.AL=$12);
end;
type VGAblok = array[0..543] of byte;
EGAblok = array[0..475] of byte;
SMAblok = array[0..271] of byte;
var VGAT : VGAblok;
EGAT : EGAblok;
SMAT : SMAblok;
Mode : byte absolute 0:$0449;
cols : byte absolute 0:$044A;
page : byte absolute 0:$0462;
EGAln : byte absolute 0:$0484;
EGApx : byte absolute 0:$0485;
const
EGAtable : EGAblok =
($00,$00,$00,$00,$00,$78,$0C,$7C,$CC,$CC,$76,$04,$0C,$06, {ąa}
$00,$00,$00,$00,$3C,$66,$60,$60,$66,$0C,$06,$3C,$00,$00, {çc}
$00,$10,$38,$6C,$00,$7C,$C6,$FE,$C0,$C6,$7C,$00,$00,$00, {ee}
$00,$00,$C6,$00,$00,$7C,$C6,$FE,$C0,$C6,$7C,$00,$00,$00, {ëe}
$00,$60,$30,$18,$00,$7C,$C6,$FE,$C0,$C6,$7C,$00,$00,$00, {ee}
$00,$00,$66,$00,$00,$38,$18,$18,$18,$18,$3C,$00,$00,$00, {ii}
$00,$18,$3C,$66,$00,$38,$18,$18,$18,$18,$3C,$00,$00,$00, {îi}
$00,$0C,$18,$30,$00,$7C,$C6,$C0,$C0,$C6,$7C,$00,$00,$00, {ćc}
$C6,$00,$10,$38,$6C,$C6,$C6,$FE,$C6,$C6,$C6,$00,$00,$00, {|A}
$00,$00,$10,$38,$6C,$C6,$C6,$FE,$C6,$C6,$C6,$04,$0C,$06, {Ą}
$00,$00,$FE,$66,$62,$68,$78,$68,$60,$66,$FE,$04,$0C,$06, {|}
$00,$00,$00,$00,$00,$7C,$C6,$FE,$C0,$C6,$7C,$04,$0C,$06, {ęe}
$00,$00,$38,$18,$18,$18,$1E,$18,$78,$18,$3C,$00,$00,$00, {łl}
$00,$10,$38,$6C,$00,$7C,$C6,$C6,$C6,$C6,$7C,$00,$00,$00, {ôo}
$00,$00,$C6,$00,$00,$7C,$C6,$C6,$C6,$C6,$7C,$00,$00,$00, {öo}
$18,$30,$3C,$66,$C2,$C0,$C0,$C0,$C0,$66,$3C,$00,$00,$00, {ĆC}
$00,$30,$78,$CC,$00,$CC,$CC,$CC,$CC,$CC,$76,$00,$00,$00, {uu}
$00,$60,$30,$18,$00,$CC,$CC,$CC,$CC,$CC,$76,$00,$00,$00, {uu}
$18,$C0,$7C,$C6,$C6,$60,$38,$0C,$06,$C6,$7C,$00,$00,$00, {ŚS}
$00,$C6,$00,$7C,$C6,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00, {ÖO}
$00,$C6,$00,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00, {-U}
$00,$18,$18,$3C,$66,$60,$60,$60,$66,$18,$18,$00,$00,$00, {Cc}
$00,$00,$F0,$60,$60,$66,$6C,$78,$70,$66,$FE,$00,$00,$00, {ŁL}
$00,$00,$66,$66,$3C,$18,$7E,$18,$7E,$18,$18,$00,$00,$00, {¦Y}
$00,$0C,$18,$30,$00,$7C,$C6,$70,$1C,$C6,$7C,$00,$00,$00, {śs}
$00,$0E,$1B,$18,$18,$18,$7E,$18,$18,$18,$18,$D8,$70,$00, { }
$18,$30,$FE,$C6,$86,$0C,$18,$30,$60,$C6,$FE,$00,$00,$00, {ŹZ}
$00,$00,$FE,$C6,$8C,$18,$FE,$30,$60,$C6,$FE,$00,$00,$00, {ŻZ}
$00,$0C,$18,$30,$00,$7C,$C6,$C6,$C6,$C6,$7C,$00,$00,$00, {óo}
$0C,$18,$7C,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00, {ÓO}
$00,$0C,$18,$30,$00,$DC,$66,$66,$66,$66,$66,$00,$00,$00, {ńn}
$0C,$18,$C6,$E6,$F6,$FE,$DE,$CE,$C6,$C6,$C6,$00,$00,$00, {ŃN}
$00,$0C,$18,$30,$00,$FE,$CC,$18,$30,$66,$FE,$00,$00,$00, {źz}
$00,$18,$18,$00,$00,$FE,$CC,$18,$30,$66,$FE,$00,$00,$00 );{żz}
VGAtable : VGAblok =
($00,$00,$00,$00,$00,$78,$0C,$7C, $CC,$CC,$CC,$76,$04,$0C,$06,$00, {134ą}
$00,$00,$00,$00,$3C,$66,$60,$60, $66,$3C,$0C,$06,$3C,$00,$00,$00, {135ç}
$00,$10,$38,$6C,$00,$7C,$C6,$FE, $C0,$C0,$C6,$7C,$00,$00,$00,$00, {136e}
$00,$00,$C6,$00,$00,$7C,$C6,$FE, $C0,$C0,$C6,$7C,$00,$00,$00,$00, {137ë}
$00,$60,$30,$18,$00,$7C,$C6,$FE, $C0,$C0,$C6,$7C,$00,$00,$00,$00, {138e}
$00,$00,$66,$00,$00,$38,$18,$18, $18,$18,$18,$3C,$00,$00,$00,$00, {139i}
$00,$18,$3C,$66,$00,$38,$18,$18, $18,$18,$18,$3C,$00,$00,$00,$00, {140î}
$00,$0C,$18,$30,$00,$7C,$C6,$C0, $C0,$C0,$C6,$7C,$00,$00,$00,$00, {141ć}
$C6,$00,$10,$38,$6C,$C6,$C6,$FE, $C6,$C6,$C6,$C6,$00,$00,$00,$00, {142|}
$00,$00,$10,$38,$6C,$C6,$C6,$FE, $C6,$C6,$C6,$C6,$04,$0C,$06,$00, {143Ą}
$00,$00,$FE,$66,$62,$68,$78,$68, $60,$62,$66,$FE,$04,$0C,$06,$00, {144|}
$00,$00,$00,$00,$00,$7C,$C6,$FE, $C0,$C0,$C6,$7C,$04,$0C,$06,$00, {145ę}
$00,$00,$38,$18,$18,$1E,$18,$78, $18,$18,$18,$3C,$00,$00,$00,$00, {146-}
$00,$10,$38,$6C,$00,$7C,$C6,$C6, $C6,$C6,$C6,$7C,$00,$00,$00,$00, {147ô}
$00,$00,$C6,$00,$00,$7C,$C6,$C6, $C6,$C6,$C6,$7C,$00,$00,$00,$00, {148ö}
$18,$30,$3C,$66,$C2,$C0,$C0,$C0, $C0,$C2,$66,$3C,$00,$00,$00,$00, {149Ć}
$00,$30,$78,$CC,$00,$CC,$CC,$CC, $CC,$CC,$CC,$76,$00,$00,$00,$00, {150u}
$00,$60,$30,$18,$00,$CC,$CC,$CC, $CC,$CC,$CC,$76,$00,$00,$00,$00, {151u}
$18,$30,$7C,$C6,$C6,$60,$38,$0C, $06,$C6,$C6,$7C,$00,$00,$00,$00, {152Ś}
$00,$C6,$00,$7C,$C6,$C6,$C6,$C6, $C6,$C6,$C6,$7C,$00,$00,$00,$00, {153Ö}
$00,$C6,$00,$C6,$C6,$C6,$C6,$C6, $C6,$C6,$C6,$7C,$00,$00,$00,$00, {154-}
$00,$18,$18,$3C,$66,$60,$60,$60, $66,$3C,$18,$18,$00,$00,$00,$00, {155C}
$00,$00,$F0,$60,$60,$66,$6C,$78, $70,$E2,$66,$FE,$00,$00,$00,$00, {156Ł}
$00,$00,$66,$66,$3C,$18,$7E,$18, $7E,$18,$18,$18,$00,$00,$00,$00, {157¦}
$00,$0C,$18,$30,$00,$7C,$C6,$60, $38,$0C,$C6,$7C,$00,$00,$00,$00, {158ś}
$00,$0E,$1B,$18,$18,$18,$7E,$18, $18,$18,$18,$18,$D8,$70,$00,$00, {159¦}
$18,$30,$FE,$C6,$86,$0C,$18,$30, $60,$C2,$C6,$FE,$00,$00,$00,$00, {160Ź}
$00,$00,$FE,$C6,$0C,$18,$FE,$30, $60,$C2,$C6,$FE,$00,$00,$00,$00, {161Ż}
$00,$0C,$18,$30,$00,$7C,$C6,$C6, $C6,$C6,$C6,$7C,$00,$00,$00,$00, {162ó}
$0C,$18,$7C,$C6,$C6,$C6,$C6,$C6, $C6,$C6,$C6,$7C,$00,$00,$00,$00, {163Ó}
$00,$0C,$18,$30,$00,$DC,$66,$66, $66,$66,$66,$66,$00,$00,$00,$00, {164ń}
$0C,$18,$C6,$E6,$F6,$FE,$DE,$CE, $C6,$C6,$C6,$C6,$00,$00,$00,$00, {165Ń}
$00,$0C,$18,$30,$00,$FE,$CC,$18, $30,$60,$C6,$FE,$00,$00,$00,$00, {166ź}
$00,$18,$18,$00,$00,$FE,$CC,$18, $30,$60,$C6,$FE,$00,$00,$00,$00 ); {167ż}
SMAtable : SMAblok =
($00,$00,$78,$0C,$7C,$CC,$76,$0C, {ąa} $00,$00,$3C,$60,$60,$3C,$06,$1C, {ç }
$7E,$C3,$3C,$66,$7E,$60,$3C,$00, {e } $66,$00,$3C,$66,$7E,$60,$3C,$00, {ë }
$70,$00,$3C,$66,$7E,$60,$3C,$00, {e } $66,$00,$38,$18,$18,$18,$3C,$00, {i }
$7C,$C6,$38,$18,$18,$18,$3C,$00, {î } $18,$30,$78,$CC,$C0,$CC,$78,$00, {ćc}
$63,$1C,$36,$63,$7F,$63,$63,$00, {|A} $30,$78,$CC,$CC,$FC,$CC,$CC,$18, {ĄA}
$FE,$62,$68,$78,$68,$62,$FE,$0C, {|E} $00,$00,$78,$CC,$FC,$C0,$78,$30, {ęe}
$70,$3C,$38,$70,$F0,$30,$78,$00, {łl} $3C,$66,$00,$3C,$66,$66,$3C,$00, {ô }
$00,$66,$00,$3C,$66,$66,$3C,$00, {ö } $18,$3C,$66,$C0,$C0,$66,$3C,$00, {ĆC}
$3C,$66,$00,$66,$66,$66,$3F,$00, {u } $00,$70,$00,$66,$66,$66,$3F,$00, {u }
$30,$7c,$C4,$70,$38,$cC,$78,$00, {ŚS} $C3,$18,$3C,$66,$66,$3C,$18,$00, {Ö }
$66,$00,$66,$66,$66,$66,$3C,$00, {- } $18,$18,$7E,$C0,$C0,$7E,$18,$18, {C }
$F0,$64,$6C,$7C,$E2,$66,$FE,$00, {ŁL} $66,$66,$3C,$7E,$18,$7E,$18,$18, {¦ }
$0C,$18,$7C,$C0,$78,$0C,$F8,$00, {śs} $0E,$1B,$18,$3C,$18,$18,$D8,$70, {¦ }
$38,$FE,$8C,$18,$32,$66,$FE,$00, {ŹZ} $FE,$C6,$0C,$7E,$30,$66,$FE,$00, {ŻZ}
$18,$30,$78,$CC,$CC,$CC,$78,$00, {óo} $18,$38,$6C,$C6,$C6,$6C,$38,$00, {ÓO}
$18,$30,$F8,$CC,$CC,$CC,$CC,$00, {ńn} $8A,$E6,$F6,$DE,$C6,$C6,$C6,$00, {ŃN}
$18,$30,$FC,$98,$30,$64,$FC,$00, {źz} $18,$00,$FC,$98,$30,$64,$FC,$00);{żz}
procedure Polish;
var RR : Registers;
begin
RR.AX:= $1110;
if EGApx=8
then begin RR.BH:= $08; { VGA 320x200 font 8x8 }
RR.ES:= Seg(SMAtable);
RR.BP:= Ofs(SMAtable)
end
else if VGA
then begin RR.BH:= $10; { VGA 8x16 }
RR.ES:= Seg(VGAtable);
RR.BP:= Ofs(VGAtable)
end
else begin RR.BH:= $0E; { EGA 8x14 }
RR.ES:= Seg(EGAtable);
RR.BP:= Ofs(EGAtable)
end;
RR.BL:= $00; RR.CX:= $22; RR.DX:= $86;
Intr( $10, RR );
{ instrukcja przełącza na SOFT FONT, ale nie wytrzymuje
przełączenia trybu pracy dlatego należy ją robić po
każdej zmianie trybu VGA }
end; { proc Polish }
procedure VideoMode( m : byte );
var R : Registers; { mozna skorzystac z funkcji }
begin { BIOSa do karty CGA/EGA/VGA }
R.AH:=$00; R.AL:= m;
Intr( $10, R );
end; { proc VideoMode }
procedure Wait4TakNie( var ch : char );
begin
repeat ch :=UpCase( ReadKey );
if (ch<>'T') AND (ch<>'N') then
begin Sound(220); Delay(150);
Sound(150); Delay(150); NoSound
end
until (ch='T') OR (ch='N');
end; { proc Wait4TakNie }
function Wait4oneFrom( aaa : PathStr ) : char;
var i : byte;
ch : char;
begin
repeat ch :=UpCase(ReadKey); i:=Pos( ch, aaa );
until i>0;
Wait4oneFrom := ch
end; { proc Wait4oneFrom }
function ASCII( sss : string ): string;
var i : integer;
key : char;
begin
if NO_EGA then
for i:=1 to Length( sss ) do
begin key := sss[ i ];
if (key>=#134) AND (key<=#167)
then sss[ i ]:= zamien[ ord(key) ];
end;
ASCII := sss;
end; { fun ASCII }
begin { część wykonawcza modułu zawiera
tylko test obecności karty EGA/VGA }
R.AX:=$1200; R.BX:=$0010; Intr( $10, R );
NO_EGA:= R.AL=$00;
end. { unit VGA_POL }
Wydruk 4
(* dla formalności zapiszemy Copyright Romuald Żyłła *)
(* ale wszyscy i tak likwiduja zbędne napisy *)
program VGA_POL_DEMO; uses CRT, VGA_POL;
var i : integer;
org_atr : byte;
procedure friteln( sss : string );
begin
writeln( ASCII( sss ) );
end;
begin org_atr:=TextAttr;
POLISH; { pierwsze ładowanie polskich liter }
for i:=1 to 8 do writeln; gotoXY(1,whereY-8);
TextAttr:=$1F;
friteln(' -¦¦¬ ');
friteln('-=+ v 0.10 +=====+ 15 czerwca 1991 +=¬');
friteln('¦ L¦¦¦- L¦¦- ¦');
friteln('¦ Demonstracja działania polskich ¦');
friteln('¦ liter - jeśli się ma kartę VGA, ¦');
friteln('¦ na CGA będą odpowiedniki w ASCII ¦');
friteln('L====================================-');
gotoXY(10,whereY); TextAttr:=$70;
write(ASCII(' wciśnij Enter ')); TextAttr:=org_atr;
readln;
VideoMode( 1 ); { stary tryb 40 znaków w wierszu }
POLISH; { ponowne ładowanie polskich liter }
friteln(' KSIĄŻE - SPÓJŻ NA TĘ ŻABĘ');
friteln(' polskie litery zostały załadowane ');
gotoXY(10,whereY); TextAttr:=$70;
write(ASCII(' wciśnij Enter ')); TextAttr:=org_atr;
readln;
VideoMode( 3 );
friteln(' KSIĄŻE - SPÓJŻ NA TĘ ŻABĘ');
friteln(' po zmianie trybu nie były ładowane ');
gotoXY(10,whereY); TextAttr:=$70;
write(ASCII(' wciśnij Enter ')); TextAttr:=org_atr;
readln;
POLISH;
friteln(' KSIĄŻE - SPÓJŻ NA TĘ ŻABĘ ');
friteln(' polskie litery zostały załadowane ');
gotoXY(10,whereY); TextAttr:=$70;
write(ASCII(' wciśnij Enter ')); TextAttr:=org_atr;
readln;
end. { demo polskich liter w trybie tekstowym }
|
|