home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 March / pcx08_9703.iso / melyviz / pcx-user / t&t / pelda02.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-12-24  |  5.1 KB  |  108 lines

  1. {*********************************************************}
  2. {                                                         }
  3. {   A program forráskódja az IDG - PCX szerkesztôségének, }
  4. {   és Bérczi László-nak a tulajdona.                     }
  5. {   A forráskód a kereskedelmi célokat kivéve szabadon    }
  6. {                    terjeszthetô !                       }
  7. {                                                         }
  8. {   PC-X User (c) 1997, március                           }
  9. {*********************************************************}
  10. {$G+}
  11. uses Crt;
  12.  
  13. procedure MyFont; external {$L myfont.obj}; {A karkészlet beszúrása}
  14.  
  15. procedure BIOSNewCharsOn(Adr: Pointer; Num, Off: Word; Block: Byte); Assembler; 
  16. asm
  17.   push  bp  {elmentjük a Stack-be a BP regisztert }
  18.   push  es  {elmentjük a Stack-be az ES regisztert}
  19.   mov   ax, 1100h {a karakterátírás funkciószáma a 11h,
  20.                    a karakter készlet betöltése az 00h alfunkció}
  21.   mov   cx, Num   {Num darab karaktert kívánunk átírni          }
  22.   mov   dx, Off   {A karakterátírás az Off-adik karaktertôl folyamatosan
  23.                    végezzük                                 }
  24.   mov   bh, 10h   {BH: 16 Byte / karakter;                  }
  25.   mov   bl, Block {BL: a paraméterként bejövô Block-adik blocka töltjük a
  26.                    karakterkészletet}
  27.   cmp   bl, 08h   {Ellenôrzés, hogy a Block változó értéke 0 és 7 között van
  28.                    e. (Pontosabban 8 alatt van e?) Mert 0-7ig vannak 
  29.                    számozva a block-ok}
  30.   jb    @Okes     {Ha 8 alatt van akkor folytatódhat a procedure az eredeti
  31.                    block számmal}
  32.   xor   bl, bl    {Amennyiben 8 vagy nála nagyobb, akkor a block számot
  33.                    az alapértelmezésre, 0-ra állítjuk}
  34. @Okes:
  35.   les   bp, Adr   {betöltjük az ES:BP reg.párba az Adr címet}
  36.   int   10h       {meghívjuk a videó megszakítást, ez a 10h }
  37.   pop   es        {kiemeljük a Stack-bôl az ES regisztert}
  38.   pop   bp        {kiemeljük a Stack-bôl a BP regisztert }
  39. end;
  40.  
  41. procedure Load8x16Font(Block: Byte); Assembler;
  42. asm  {Betöltjük, a Block-adik block-ba a VGA alapértelmezett 8x16-os betûtípusát}
  43.   mov  ax, 1104h
  44.   mov  bl, Block
  45.   cmp   bl, 08h
  46.   jb    @Okes
  47.   xor   bl, bl
  48. @Okes:
  49.   int  10h
  50. end;
  51.  
  52. procedure SetDualFontTable(Block1, Block2: Byte); Assembler;
  53. asm {NO comment, just like the AsM articles ...}
  54.   mov  al, Block1 {al, bl: Block1;  ah, bh: Block2       }
  55.   mov  ah, Block2 
  56.   mov  bx, ax     {BL register form is: 00 21 22 11      }
  57.   and  ax, 0000001100000011b {clear all but low two bits }
  58.   and  bx, 0000010000000100b {clear all but 3. bit       }
  59.   shl  bl, 2 {SHL Block1 3. bit to position : 00 0x 22 11}
  60.   shl  bh, 3 {SHL Block2 3. bit to position : 00 x0 22 11}
  61.   shl  ah, 2 {SHL Block2 low two bits to pos: 00 00 xx 00; 3. bit is in place}
  62.   or   bl, al {ADD Block1 low two bits, and 3. bit       }
  63.   or   bh, ah {ADD Block2 low two bits, and 3. bit       }
  64.   or   bl, bh {ADD swapped bits as form: 00 21 22 11     }
  65.   mov  ax, 1103h
  66.   int  10h
  67. end;
  68.  
  69. procedure WaitToKeyStroke; Assembler;
  70. asm {16h megszakítás a billentyû megszakítása, AH = 00 billentyû beolvasása}
  71.   xor ah, ah {mov ah, 0}
  72.   int 16h
  73. end;
  74.  
  75. BEGIN
  76.   BIOSNewCharsOn(@MyFont, 255, 0, 3); {Betöltjük, a 3. block-ba a mi karakterkészletünket.}
  77.   Load8x16Font(2); {Betöltjük, a 2. block-ba a VGA alapértelmezett 8x16-os betûtípusát}
  78.   SetDualFontTable(2, 3); {Kijelöli kettos karakterkészlet használatára 
  79.                            a 2, és 3 block-ban található font-okat}
  80.   ClrScr; {Képernyôtörlés}
  81.   GotoXY(2, 2); TextAttr:=$07; Write(#208); {kiír egy próba karaktert}
  82.    {melynek villogása  : 00 - Nincs
  83.             háttérszíne: 00
  84.             másodlagos karakterkészlet kiválasztó bit-je: 0
  85.             elôtérszíne: 07 - Szürke                      (VHHHKEEE)
  86.                            így a karakter színe binárisan: 00001111b
  87.     ahol: V a villogás bit-je, 
  88.           H: a háttérszín bit-jei, 
  89.           K másodlagos karakterkészlet kiválasztó bit-je, ha egy akkor az
  90.             második kar.készlet karaktere látszik a képernyôbe.
  91.           E: az elôtérszín bit-jei}
  92.   GotoXY(3, 3); TextAttr:=$2F; Write(#208); {kiír egy próba karaktert}
  93.    {melynek villogása  : 00 - Nincs
  94.             háttérszíne: 01 - Zöld
  95.             másodlagos karakterkészlet kiválasztó bit-je: 1 -tehát kiválasztott
  96.             elôtérszíne: 07 - Fehér                        (VHHHKEEE)
  97.                            így a karakter színe binárisan: 00101111b}
  98.    {FIGYELEM: NEM tévedés, 
  99.     - az elsô karakterkészlet (jelen esetben 2. block) elôtérszínei 0-7 
  100.     alacsonyintenzitásuak - olyan mint amikor csak egy karakterkészletet 
  101.     használunk, és mintha ott is 0-7 ig használnánk a színeket
  102.     - a második karakterkészlet (jelen esetben 3. block) elôtérszínei 0-7 
  103.     MAGASintenzitásuak - olyan mint amikor csak egy karakterkészletet 
  104.     használunk, és mintha ott 8-15 ig használnánk a színeket !!!}
  105.   WaitToKeyStroke; {Vár egy billentyûütésre}
  106.   SetDualFontTable(0, 0); {Visszaállítja egy karakterkészlet használatára a VGA kártyát}
  107.   Load8x16Font(0); {Betöltjük, a 0. block-ba a VGA alapértelmezett 8x16-os betûtípusát}
  108. END. {Osztán kilépünk! Ahhh DOS again!}