program aufgabe25;
var a,b : integer;

(* Teil a ... *)
function getBinLength(x,y : integer):integer;
(* hier geeignete Variablen einfuegen *)
begin
   getBinLength := 4; (* diese Zeile durch geeigneteren Code ersetzen,
                       * so dass "beliebig" große Binärzahlen erzeugt werden
                       * koennen
                       *)
end; { getBinLength }

(* erzeugt aus der Zahl x einen String der Laenge laenge,
 * der genau die Binärdarstellung von x, ggf. mit fuehrenden Nullen, ist
 * 
 * Beispiel: x = 3, laenge = 6 -> '000011'
 *)
function int2binstr(x,laenge : integer):string;
var ergebnis : string;
    rest,i,j : integer;
    ziffer   : char;
begin
   ergebnis := '';
   i := 1;
   while ((x > 0) and (i<=laenge)) do begin
      rest := x mod 2;
      x := x div 2;
      ziffer := '0';
      if (rest=1) then ziffer := '1';      
      ergebnis := ziffer + ergebnis;
      i := i + 1;
   end;
   for j:=i to laenge do ergebnis := '0' +ergebnis; (* mit 0 auffüllen *)
   int2binstr := ergebnis;
end; { int2binstr }

(* Teil b... *)
procedure add(mult : string; var r: char; var ac1,ac0 : string);
(* hier geeignete Variablen einfuegen *)
begin
   (* hier geeigneten Code einfuegen *)
end; { add }

(* Teil c... *)
procedure shift(var r : char; var ac1,ac0 : string);
(* hier geeignete Variablen einfuegen *)
begin
   (* hier geeigneten Code einfuegen *)
end; { shift }

(* simuliert den Von-Neumann-Multiplizierer aus der Vorlesung *)
procedure vnmult(x,y: integer);
var ac1,ac0 : string;
    r       : char;
    z,i     : integer;
    mult    : string;
begin
   r := '0';
   z := getBinLength(x,y);
   ac1 := int2binstr(0,z);
   ac0 := int2binstr(x,z);
   mult := int2binstr(y,z);
   writeln('z=',z,', mult=',mult,', ac0=',ac0);
   writeln;
   for i:=z downto 1 do begin
      writeln('R|AC1|AC0 vor Add:    ',r,'|',ac1,'|',ac0);
      add(mult,r,ac1,ac0);
      writeln('R|AC1|AC0 nach Add:   ',r,'|',ac1,'|',ac0);
      shift(r,ac1,ac0);
      writeln('R|AC1|AC0 nach Shift: ',r,'|',ac1,'|',ac0);
      writeln('z=',i-1);
      writeln;
   end;
   writeln('Das Ergebnis lautet: ',r,ac1,ac0);
end; { vnmult }
   
begin
   write('Bitte den ersten Faktor (dezimal) eingeben:  ');
   readln(a);
   write('Bitte den zweiten Faktor (dezimal) eingeben: ');
   readln(b);
   vnmult(a,b);
end.
