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.