Otra calculadora que tiene uno que otro detalle

pascal:
uses
        crt;{Cargamos la libreria del teclado}
var
        tecla                  : Char;{Leyendo teclas}
        valor1,valor2            : Longint;{Valores para calcular}
        operando,x                              : integer;{el operando y la abscisa}
        aux                                   : String;{Auxiliar para ir concatenando digitos}
        operacion, error,mostrado       : boolean;{Banderas}

function agregar(tecla:char;valor:longint):longint;
        {Va concatenando la tecla en la variable valor y devuelve valor}
        var
                aux     : String;{Variable auxiliar para ir concatenando}
        begin
                str(valor,aux);{Asignamos a aux el contenido de valor}
                {0,1,2,3,4,5,6,7,8,9}
                if (ord(tecla)>47)AND(ord(tecla)<58) then
                {Verificamos si un digito fue introducido en tecla mediante su
                valor ordinal en la tabla de codigo ascii}

                        begin
                                if NOT(length(aux)>8) then
                                {Si la longitud no es mayor a 8 seguimos permitiendo agregar digitos}
                                        begin
                                                val(concat(aux,tecla),valor);{concatenamos la tecla en aux, se lo asignamos a valor el
                                                contenido de la concatenacion convirtiendolo a valor numerico}

                                        end;
                        end;
                {BackSpace}
                if (ord(tecla)=8)AND(length(aux)>0) then{si quiere eliminar un caracter y la cadena es mayor a cero}
                        begin
                                if valor<10 then {Si solo hay un digito, entonces cuando de borrar lo convertimos a cero}
                                        valor:=0;
                                delete(aux,length(aux),1);{Eliminamos de la ultima posicion un digito}
                                val(aux,valor);{Asignamos a valor el contenido de aux convertido en valor numerico}
                        end;
                agregar:=valor;{Devolvemos el valor en la funcion}
        end;

procedure calculadora(t:Char);{Dibuja una simulacion de calculadora en pantalla}
        procedure coloreado(texto:string;x,y:integer);
        {Procedimiento local de calculadora que colorea el texto en
        una coordenada dada por x y y}

                begin
                        textcolor(green);
                        gotoxy(x,y);
                        write(texto);
                        textcolor(white);
                end;
        begin{Inicia el procedimiento}
                {dibuja calculadora}
                gotoxy(3,2);writeln('-----  <');
                gotoxy(3,3);writeln('7 8 9  +');
                gotoxy(3,4);writeln('4 5 6  -');
                gotoxy(3,5);writeln('1 2 3  *');
                gotoxy(3,6);writeln('0      /');
               
                {Si es cualquier digito numerico colorea su digito}
                if ord(tecla)=57{9} then coloreado('9',7,3);
                if ord(tecla)=56{8} then coloreado('8',5,3);
                if ord(tecla)=55{7} then coloreado('7',3,3);
                if ord(tecla)=54{6} then coloreado('6',7,4);
                if ord(tecla)=53{5} then coloreado('5',5,4);
                if ord(tecla)=52{4} then coloreado('4',3,4);
                if ord(tecla)=51{3} then coloreado('3',7,5);
                if ord(tecla)=50{2} then coloreado('2',5,5);
                if ord(tecla)=49{1} then coloreado('1',3,5);
                if ord(tecla)=48{0} then coloreado('0',3,6);
               
                {Si es un digto BackSpace o operando lo colorea}
                if ord(tecla)=8{BackSpace} then coloreado('<',10,2);
                if ord(tecla)=43{+} then coloreado('+',10,3);
                if ord(tecla)=45{-} then coloreado('-',10,4);
                if ord(tecla)=42{*} then coloreado('*',10,5);
                if ord(tecla)=47{/} then coloreado('/',10,6);
        end;{Fin del procedimiento dibuja calculadora}

begin{Programa principal}
        clrscr;{Limpia pantalla}
        valor1    :=0;{inicializa los valores principales}
        valor2    :=0;{}
        aux               :='';{}
        operacion       :=false;{No hay operacion pendiente}
        error      :=false;{No hay errores en las operaciones}
        mostrado        :=false;{No se ha mostrado el resultado}
        calculadora(' ');{Dibuja la calculadora sin remarcar ningun digito}
        repeat{Repite la calculadora hasta que no se presione salir (Tecla ESC)}
                str(valor1,aux);{Asigna a aux el valor de valor1 si existe}
                x:=11-length(aux);{Especificamos la abscisa para que el texto se recorra de derecha a isquierda segun la cantidad de digitos}
                tecla:=readkey;{Se le asigna a tecla el valor insertado desde el teclado}
                calculadora(tecla);{Dibujamos la calculadora dibujando el caracter presionado}
                if (ord(tecla)=13)OR(((ord(tecla)=42)OR(ord(tecla)=43)OR(ord(tecla)=45)OR(ord(tecla)=47))AND(operacion=true)) then
                        {Si tecla es ENTER o un operando y hay una operacion pendiente (Ya se ha insertado valor1)}
                        begin
                                case ord(operando) of{Evalua que operando ha sido insertado para realizar operacion}
                                                42{*}:{Multiplic}
                                                        begin
                                                                if ord(tecla)<>42 then{Evalua que no se inserte dos veces el operando * seguido
                                                                ya que automaticamente valor2 tomaria el valor cero trallendo resultado indeseado (0)}

                                                                        valor1:=valor1*valor2;
                                                        end;
                                                43{+}:{Suma}
                                                                valor1:=valor1+valor2;
                                                45{-}:{Resta}
                                                                valor1:=valor1-valor2;
                                                47{/}:{Division}
                                                        begin
                                                                if ord(tecla)<>47 then{Evalua que no se inserte dos veces el operando / seguido
                                                                ya que automaticamente valor2 tomaria el valor2 cero mostrando así un error}

                                                                        if valor2<>0 then{Si el dividendo (valor2) no es cero}
                                                                                        valor1:=valor1 div valor2{Divide}
                                                                                else
                                                                                        error:=true;{No divie activa la bandera de error}
                                                        end;
                                        end;
                                operacion       := false;{Apaga la bandera de operacion pendiente}
                                operando        := 0;{Devuelve operando a cero para que no esté activado si ya se utilizo}
                                valor2      := 0;{Devuelve valor2 a cero}
                                gotoxy(1,1);write('                ');{Limpia la parte donde escribira el resultado}
                                if error=false then{Si la bandera error esta apagada}
                                                begin
                                                        gotoxy(x,1);
                                                        write(valor1);{Muestra el resultado}
                                                end;
                                if error=true then{Si la banera error esta encenida}
                                        begin
                                                valor1:=0;{Devuelve valor1 a cero}
                                                gotoxy(1,1);write('ERROR');{Muestra msg de error en pantalla}
                                                error:=false;{vuelve a apagar la bandera de error}
                                        end;
                                mostrado:=true;{Enciente la bandera de que ha sido mostrado el resultado}
                        end;{Fin de .... {Si tecla es ENTER o un operando y hay una operacion pendiente (Ya se ha insertado valor1)}}

                if mostrado=false then {Si la bandera mostrado esta apagada (no se ha mostrado un resultado)}
                        begin
                                case operacion of{Evaluamos si hay una operacion pendiente o si todavia se esta lellendo el valor1}
                                                false:{Todavia se esta lellendo valor1}
                                                        begin
                                                                str(valor1,aux);{Asignamos a aux lo de valor1}
                                                                valor1:=agregar(tecla,valor1);{Mandamos llamar la funcion agregar
                                                                con el valor1 de la tecla y lo que tiene valor (...concatenar valores)}

               
                                                                gotoxy(1,1);write('           ');{Limpia parte donde muestra resultado}
                                                                gotoxy(x,1);write(valor1);{Muestra resultado de concatenar}
                                                        end;
                       
                                                true:{Ya se esta lellendo valor2 (Hay una operacion pendiente por realizar ya)}
                                                        begin
                                                                str(valor2,aux);
                                                                valor2:=agregar(tecla,valor2);{Mandamos llamar la funcion agregar
                                                                con el valor2 de la tecla y lo que tiene valor (...concatenar valores)}

               
                                                                gotoxy(1,1);write('           ');{Limpia parte donde muestra resultado}
                                                                gotoxy(x,1);write(valor2);{Muestra el resultado de concatenar}
                                                        end;{Fin de evaluar si hay o no operacion pendiente}
                                        end;{Fin del case}
                       
                                if (ord(tecla)=42{*}) OR (ord(tecla)=43{+}) OR (ord(tecla)=45{-}) OR (ord(tecla)=47{/}) then
                                {Si tecla es uno de los operandos *,/,-,+}
                                        begin
                                                operacion:=true;{Enciende la bandera de operacion pendiente}
                                                operando := ord(tecla);{Asigna a operando el valor ordinal de la tecla (el operando insertado)}
                                                gotoxy(11,1);write(tecla);{Se va a la coordenada donde termina la parte para mostrar resulstado y muestra
                                                el operando}

                                        end;
                        end;{Fin de si la banedera mostrado esta apagada}
        mostrado:=false;{Apagamos la bandera de que ha sido mostrado el resultado}
        until ord(tecla)=27;{Hasta que el valor ordinal de la tecla sea 27 (Tecla ESC)}
end.
¿Ya le viste algún error? Dejanos tu correción ;-)

Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress elimina los tags HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios.

Otro punto antes de comentar, Si vas a sugerir un segmento de código en algún lenguaje debes hacerlo así:

De esta manera el código sale coloreado.

Otro punto importante para muchos que sienten que se les ignora: Todos los comentarios los reviso y en su debido momento los apruebo, pero ojo con el último párrafo.

Para poner los símbolos de las librerías sin que desaparezcan, debes escribir los símbolos de mayor > y menor qué < con su entidad HTML correspondiente, así como el símbolo de &

Mis Algoritmos se reserva el derecho de alterar, publicar o no los comentarios así como cambiar estas reglas de uso.

Si estas de acuerdo, adelante puedes comentar :)

P.D. No le hago tareas a nadie, mejor hagan la mía :P