Here is a little rewrite of your code for Moves and Pushes in the 4 directions.
Code:
local DX, DY;
...
IF xmouse<80 AND ymouse>60 AND ymouse<180 THEN DY:=0; DX:=-1; END;
IF xmouse>240 AND ymouse>60 AND ymouse<180 THEN DY:=0; DX:=1; END;
IF xmouse>80 AND xmouse<240 AND ymouse<60 THEN DY:=-1; DX:=0; END;
IF xmouse>80 AND xmouse<240 AND ymouse>180 THEN DY:=1; DX:=0; END;
CASE
IF matriz [YYP+1+DY, XXP+1+DX] == 0 OR matriz [YYP+1+DY, XXP+1+DX] == 3 THEN
IF matriz [YYP+1,XXP+1] == 0 THEN BLIT_P(G5,XXP*16,YYP*16); END;
IF matriz [YYP+1,XXP+1] == 3 THEN BLIT_P(G3,XXP*16,YYP*16); END;
YYP := YYP+DY; XXP := XXP+DX;
BLIT_P(G4,XXP*16,YYP*16);
MOVI := MOVI + 1;
END; //-----------------------------------
IF ((matriz [YYP+1+DY,XXP+1+DX]==2) OR (matriz [YYP+1+DY,XXP+1+DX]==5)) AND ((matriz [YYP+1+2*DY,XXP+1+2*DX]==0) OR (matriz [YYP+1+2*DY,XXP+1+2*DX]==3)) THEN
IF matriz [YYP+1,XXP+1] == 0 THEN BLIT_P(G5,XXP*16,YYP*16); END;
IF matriz [YYP+1,XXP+1] == 3 THEN BLIT_P(G3,XXP*16,YYP*16); END;
YYP := YYP+DY; XXP := XXP+DX;
BLIT_P(G4,XXP*16,YYP*16);
BLIT_P(G2,(XXP+DX)*16,(YYP+DY)*16);
IF (matriz [YYP+1,XXP+1]==2) THEN matriz [YYP+1,XXP+1] := 0; ELSE matriz [YYP+1,XXP+1] := 3; END;
IF (matriz [YYP+1+DY,XXP+1+DX]==0) THEN matriz [YYP+1+DY,XXP+1+DX] := 2; ELSE matriz [YYP+1+DY,XXP+1+DX] := 5; END;
MOVI := MOVI + 1;
PUSH := PUSH + 1;
END; //-----------------------------------
END;
Since Moves and Pushes are the same in each directions, this code is doing the trick without duplicating the code. It save about 20K in source code.