magari è brutto ma prova così

codice:
program CICLO;


uses
  crt;                             {Richiamo la unit CRT}

var
  NUMERO, R, R2: integer;
  RISPOSTA: string;
procedure procedura_pari;    {questo funziona bene...}
  begin
    while (NUMERO <> 1) do
      begin
        NUMERO := NUMERO div 2;
        R:= NUMERO mod 2;
        if(R <> 0) THEN
           goto dacapo;
        writeln (NUMERO);
      end;
      writeln ('------------------------------');
      writeln ('FINITO!!');
  end;

procedure procedura_dispari;
  begin
    while (NUMERO <> 1) do      {finchè il numero è diverso da 1}
      begin
        R2 := NUMERO mod 2;     
        while (R2 <> 0) do       {ficnhè il numero è dispari (resto diverso da 0)}
        begin
          NUMERO := ((NUMERO*3)+1) div 2;
          writeln(NUMERO);
        end;
       procedura_pari;
      end;                        
  end;


begin
    clrscr;
    writeln('Questo programma Š stato orgogliosamente realizzato da Kilin');
    writeln('per ovviare alla mancanza di materia grigia di KleRoi.');
    writeln;
    readln;
    writeln('Via su, dammi ir numero... non nell''occhio, o'' duro!');
    read(NUMERO);
    R:= NUMERO mod 2;
    dacapo:
    if(R=0) then                 {Se il resto Š 0, il numero Š pari....}
      begin
        procedura_pari;
        readln;
      end
    else
      procedura_dispari;
      readln;
end.
ho deciso di usare le label
anche se cmq non uso pascal da mesi
te devi fare 2 cose

o esci dalla procedura (e qui non ricordo se c'è un costrutto x farlo)
oppure fai un salto condizionato che ti porta dove vuoi che si svogla il lavoro


ciao