Дано задание:
Циклически сдвинуть двоичные разряды числа на одну позицию вправо.

Вот код программы, я только кое-что исправил в нем.
Код
uses crt;
function pow2(A:byte):Integer;
var result: Integer;
    i: Integer;
begin
  result := 1;
  for i:=1 to A do
    result := result * 2;
  pow2 := result;
end;

procedure Print_binary (d: word);
var
  mask: word;
  i: 1..16;
begin
  mask:=$8000;
  for i:=1 to 16 do begin
    if d and mask=0 then
     write (0)
    else
     write (1);
    mask:=mask shr 1;
  end;
  writeln;
  writeln;
end;

function cyclicShiftRight(number: word; cyclicBitsRight: byte):word;
var
    mask :Integer;
    x,y :word;
begin
    cyclicBitsRight := cyclicBitsRight mod 16;
    mask := pow2(16) - pow2(16 - cyclicBitsRight);
    y := number and mask;
    y := x shl (16 - cyclicBitsRight);
    x := number shr cyclicBitsRight;
    cyclicShiftRight := y or x;
end;

Var
  a,c: word;
begin
  clrscr;
  a:=55555;
  write ('a = ');
  Print_binary (a);
  c:= cyclicShiftRight(a, 1);
  write ('a = ');
  Print_binary (c);
  readln;
end.

Вроде бы правильно решено.
Просят объяснить назначение процедуры и функций.