home *** CD-ROM | disk | FTP | other *** search
- {*********************************************************}
- { }
- { A program forráskódja az IDG - PCX szerkesztôségének, }
- { és Bérczi László-nak a tulajdona. }
- { A forráskód a kereskedelmi célokat kivéve szabadon }
- { terjeszthetô ! }
- { }
- { PC-X User (c) 1997, március }
- {*********************************************************}
- {$G+}
- uses Crt;
-
- procedure MyFont; external {$L myfont.obj}; {A karkészlet beszúrása}
-
- procedure BIOSNewCharsOn(Adr: Pointer; Num, Off: Word; Block: Byte); Assembler;
- asm
- push bp {elmentjük a Stack-be a BP regisztert }
- push es {elmentjük a Stack-be az ES regisztert}
- mov ax, 1100h {a karakterátírás funkciószáma a 11h,
- a karakter készlet betöltése az 00h alfunkció}
- mov cx, Num {Num darab karaktert kívánunk átírni }
- mov dx, Off {A karakterátírás az Off-adik karaktertôl folyamatosan
- végezzük }
- mov bh, 10h {BH: 16 Byte / karakter; }
- mov bl, Block {BL: a paraméterként bejövô Block-adik blocka töltjük a
- karakterkészletet}
- cmp bl, 08h {Ellenôrzés, hogy a Block változó értéke 0 és 7 között van
- e. (Pontosabban 8 alatt van e?) Mert 0-7ig vannak
- számozva a block-ok}
- jb @Okes {Ha 8 alatt van akkor folytatódhat a procedure az eredeti
- block számmal}
- xor bl, bl {Amennyiben 8 vagy nála nagyobb, akkor a block számot
- az alapértelmezésre, 0-ra állítjuk}
- @Okes:
- les bp, Adr {betöltjük az ES:BP reg.párba az Adr címet}
- int 10h {meghívjuk a videó megszakítást, ez a 10h }
- pop es {kiemeljük a Stack-bôl az ES regisztert}
- pop bp {kiemeljük a Stack-bôl a BP regisztert }
- end;
-
- procedure Load8x16Font(Block: Byte); Assembler;
- asm {Betöltjük, a Block-adik block-ba a VGA alapértelmezett 8x16-os betûtípusát}
- mov ax, 1104h
- mov bl, Block
- cmp bl, 08h
- jb @Okes
- xor bl, bl
- @Okes:
- int 10h
- end;
-
- procedure SetDualFontTable(Block1, Block2: Byte); Assembler;
- asm {NO comment, just like the AsM articles ...}
- mov al, Block1 {al, bl: Block1; ah, bh: Block2 }
- mov ah, Block2
- mov bx, ax {BL register form is: 00 21 22 11 }
- and ax, 0000001100000011b {clear all but low two bits }
- and bx, 0000010000000100b {clear all but 3. bit }
- shl bl, 2 {SHL Block1 3. bit to position : 00 0x 22 11}
- shl bh, 3 {SHL Block2 3. bit to position : 00 x0 22 11}
- shl ah, 2 {SHL Block2 low two bits to pos: 00 00 xx 00; 3. bit is in place}
- or bl, al {ADD Block1 low two bits, and 3. bit }
- or bh, ah {ADD Block2 low two bits, and 3. bit }
- or bl, bh {ADD swapped bits as form: 00 21 22 11 }
- mov ax, 1103h
- int 10h
- end;
-
- procedure WaitToKeyStroke; Assembler;
- asm {16h megszakítás a billentyû megszakítása, AH = 00 billentyû beolvasása}
- xor ah, ah {mov ah, 0}
- int 16h
- end;
-
- BEGIN
- BIOSNewCharsOn(@MyFont, 255, 0, 3); {Betöltjük, a 3. block-ba a mi karakterkészletünket.}
- Load8x16Font(2); {Betöltjük, a 2. block-ba a VGA alapértelmezett 8x16-os betûtípusát}
- SetDualFontTable(2, 3); {Kijelöli kettos karakterkészlet használatára
- a 2, és 3 block-ban található font-okat}
- ClrScr; {Képernyôtörlés}
- GotoXY(2, 2); TextAttr:=$07; Write(#208); {kiír egy próba karaktert}
- {melynek villogása : 00 - Nincs
- háttérszíne: 00
- másodlagos karakterkészlet kiválasztó bit-je: 0
- elôtérszíne: 07 - Szürke (VHHHKEEE)
- így a karakter színe binárisan: 00001111b
- ahol: V a villogás bit-je,
- H: a háttérszín bit-jei,
- K másodlagos karakterkészlet kiválasztó bit-je, ha egy akkor az
- második kar.készlet karaktere látszik a képernyôbe.
- E: az elôtérszín bit-jei}
- GotoXY(3, 3); TextAttr:=$2F; Write(#208); {kiír egy próba karaktert}
- {melynek villogása : 00 - Nincs
- háttérszíne: 01 - Zöld
- másodlagos karakterkészlet kiválasztó bit-je: 1 -tehát kiválasztott
- elôtérszíne: 07 - Fehér (VHHHKEEE)
- így a karakter színe binárisan: 00101111b}
- {FIGYELEM: NEM tévedés,
- - az elsô karakterkészlet (jelen esetben 2. block) elôtérszínei 0-7
- alacsonyintenzitásuak - olyan mint amikor csak egy karakterkészletet
- használunk, és mintha ott is 0-7 ig használnánk a színeket
- - a második karakterkészlet (jelen esetben 3. block) elôtérszínei 0-7
- MAGASintenzitásuak - olyan mint amikor csak egy karakterkészletet
- használunk, és mintha ott 8-15 ig használnánk a színeket !!!}
- WaitToKeyStroke; {Vár egy billentyûütésre}
- SetDualFontTable(0, 0); {Visszaállítja egy karakterkészlet használatára a VGA kártyát}
- Load8x16Font(0); {Betöltjük, a 0. block-ba a VGA alapértelmezett 8x16-os betûtípusát}
- END. {Osztán kilépünk! Ahhh DOS again!}