Some comments, with your kind permission:
1 - Since
ReadKey already waits for a key to be pressed, your empty loop checking for
KeyPressed is superfluous.
2 - This code:
if x = -1 then x:=x+2;
if y = 0 then y:=y+1;
is equivalent to this:
if x = -1 then x:=1;
if y = 0 then y:=1;
which is somewhat faster (no operations involved) and makes clearer what it really means.
3 - Your code unneccessarily clears the screen and writes the "o" in the same place it was when the key isn't one of those you're looking for.
4 - Since you position the cursor back under the recently written character, you may just write a space over it to delete it rather than incurring the cost of clearing the whole screen.
Taking all into account, this might be a better (though not yet "perfect") way to make it:
program move;
uses crt;
var
x,y: integer;
key: char;
doDraw: Boolean;
procedure WriteO;
begin
if x = -1 then x:=1;
if y = 0 then y:=1;
write(' ');
gotoxy(x,y);
write('o');
gotoxy(x,y);
end;
begin
x:=1;
y:=1;
ClrScr;
WriteO;
repeat
key:=readkey;
if key = #0 then key:=readkey;
doDraw := true;
case key of
#72,'W','w': y:=y-1;
#75,'A','a': x:=x-2;
#80,'S','s': y:=y+1;
#77,'D','d': x:=x+2;
else doDraw := False;
end; {end case key}
if doDraw then WriteO;
until key = #27;
end.