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 }
Valid HTML 4.01 Transitional to jest moja skrzynka pocztowa ==> mail to me - Romek