program kurzor; uses dos; { potrebne pro funkci Intr a datovy typ Registers, } { pokud se pracuje pouze s assemblerem, neni treba. } var v_rezim: byte absolute $40:$49; { na teto adrese uklada Bios cislo videorezimu } v_stary: byte; { cislo stareho modu ulozime kvuli navratu } procedure SchovejKurzor1_PAS; { schovani kurzoru mimo zobrazitelnou oblast pomoci prostredku Pascalu } var r: Registers; begin with r do begin ah := 2; { sluzba cislo 2 v preruseni cislo 10h } bh := 0; { nastavime BH na 0 (cislo stranky), efektivnejsi nez mov BH,0 } dh := 25;{ cislo radku od 0, 25 je mimo obrazovku } dl := 0; { cislo sloupce od 0, cislo 0 znamena prvni sloupec obrazovky } end; Intr($10, r); { volani preruseni s vyse nastavenymi parametry, hexadecimalne } end; procedure SchovejKurzor2_PAS; { schovani kurzoru nastavenim jeho velikosti pomoci prostredku Pascalu } var r: Registers; begin with r do begin ah := 1; ch := $20; cl := $1f; end; Intr($10, r); end; procedure SchovejKurzor1_ASM; assembler; { schovani kurzoru mimo zobrazitelnou oblast pomoci assembleru, efektivnejsi } asm mov AH,2 xor BH,BH mov DH,25 xor DL,DL int 10h end; procedure SchovejKurzor2_ASM; assembler; { schovani kurzoru nastavenim jeho velikosti pomoci prostredku assembleru } asm mov AH,1 mov CH,20h mov CL,1Fh int 10h end; procedure NastavKurzor(x,y: byte); assembler; { nastaveni kurzoru na souradnice [x,y], oboji pocitano OD NULY!!! } asm mov AH,1 mov CH,1Fh mov CL,1Fh int 10h mov AH,2 xor BH,BH mov DH,y mov DL,x int 10h end; procedure CekejNaKlavesu; assembler; { ceka, dokud nebyla stisknuta jakakoliv klavesa } asm mov AH,10h int 16h { kdyby me zajimalo, ktera klavesa byla stisknuta, v AL je ASCII kod znaku, v AH je scan kod. Cela klavesa je tedy v AX } end; procedure Init; { inicializace - uschovame cislo videorezimu, pak nastavime vlastni, zaroven se vycisti obrazovka } begin v_stary := v_rezim; asm xor AH,AH mov AL,3 int 10h end; end; procedure Done; assembler; { uklid - vratime ten videorezim, ktery byl pred spustenim programu } asm xor AH,AH mov AL,v_stary int 10h end; begin Init; write('SchovejKurzor1, funkce Pascalu'); SchovejKurzor1_PAS; CekejNaKlavesu; NastavKurzor(0,0); write('SchovejKurzor1, assembler '); SchovejKurzor1_ASM; CekejNaKlavesu; NastavKurzor(0,0); write('SchovejKurzor2, funkce Pascalu'); SchovejKurzor2_PAS; CekejNaKlavesu; NastavKurzor(0,0); write('SchovejKurzor2, assembler '); SchovejKurzor2_ASM; CekejNaKlavesu; Done; end.