* WinMinX, WinMinY, WinMaxX and WinMaxY helper functions replaced with absolute packed records overlaid on top of WindMin and WindMax for faster access

git-svn-id: trunk@25474 -
This commit is contained in:
nickysn 2013-09-12 23:39:56 +00:00
parent e42e9bb677
commit 70937d93c1

View File

@ -122,44 +122,14 @@ end;
Helper Routines Helper Routines
****************************************************************************} ****************************************************************************}
Function WinMinX: Byte; var
{ WinMin: packed record
Current Minimum X coordinate X, Y: Byte;
} end absolute WindMin;
Begin
WinMinX:=WindMin and $ff;
End;
Function WinMinY: Byte;
{
Current Minimum Y Coordinate
}
Begin
WinMinY:=WindMin shr 8;
End;
Function WinMaxX: Byte;
{
Current Maximum X coordinate
}
Begin
WinMaxX:=WindMax and $ff;
End;
Function WinMaxY: Byte;
{
Current Maximum Y coordinate;
}
Begin
WinMaxY:=WindMax shr 8;
End;
WinMax: packed record
X, Y: Byte;
end absolute WindMax;
Function FullWin:boolean; Function FullWin:boolean;
@ -167,8 +137,8 @@ Function FullWin:boolean;
Full Screen 80x25? Window(1,1,80,25) is used, allows faster routines Full Screen 80x25? Window(1,1,80,25) is used, allows faster routines
} }
begin begin
FullWin:=(WinMinX=0) and (WinMinY=0) and FullWin:=(WinMin.X=0) and (WinMin.Y=0) and
((WinMaxX+1)=ScreenWidth) and ((WinMaxY+1)=ScreenHeight); ((WinMax.X+1)=ScreenWidth) and ((WinMax.Y+1)=ScreenHeight);
end; end;
@ -258,11 +228,11 @@ Procedure GotoXy(X: tcrtcoord; Y: tcrtcoord);
Go to coordinates X,Y in the current window. Go to coordinates X,Y in the current window.
} }
Begin Begin
If (X>0) and (X<=WinMaxX- WinMinX+1) and If (X>0) and (X<=WinMax.X- WinMin.X+1) and
(Y>0) and (Y<=WinMaxY-WinMinY+1) Then (Y>0) and (Y<=WinMax.Y-WinMin.Y+1) Then
Begin Begin
Inc(X,WinMinX); Inc(X,WinMin.X);
Inc(Y,WinMinY); Inc(Y,WinMin.Y);
SetScreenCursor(x,y); SetScreenCursor(x,y);
End; End;
End; End;
@ -295,8 +265,8 @@ begin
DosmemFillWord(VidSeg,0,ScreenHeight*ScreenWidth,fil) DosmemFillWord(VidSeg,0,ScreenHeight*ScreenWidth,fil)
else else
begin begin
for y:=WinMinY to WinMaxY do for y:=WinMin.Y to WinMax.Y do
DosmemFillWord(VidSeg,(y*ScreenWidth+WinMinX)*2,WinMaxX-WinMinX+1,fil); DosmemFillWord(VidSeg,(y*ScreenWidth+WinMin.X)*2,WinMax.X-WinMin.X+1,fil);
end; end;
Gotoxy(1,1); Gotoxy(1,1);
end; end;
@ -312,8 +282,8 @@ var
Begin Begin
GetScreenCursor(x,y); GetScreenCursor(x,y);
fil:=32 or (textattr shl 8); fil:=32 or (textattr shl 8);
if x<=(WinMaxX+1) then if x<=(WinMax.X+1) then
DosmemFillword(VidSeg,((y-1)*ScreenWidth+(x-1))*2,WinMaxX-x+2,fil); DosmemFillword(VidSeg,((y-1)*ScreenWidth+(x-1))*2,WinMax.X-x+2,fil);
End; End;
@ -326,7 +296,7 @@ var
x,y : smallint; x,y : smallint;
Begin Begin
GetScreenCursor(x,y); GetScreenCursor(x,y);
WhereX:=x-WinMinX; WhereX:=x-WinMin.X;
End; End;
@ -339,7 +309,7 @@ var
x,y : smallint; x,y : smallint;
Begin Begin
GetScreenCursor(x,y); GetScreenCursor(x,y);
WhereY:=y-WinMinY; WhereY:=y-WinMin.Y;
End; End;
@ -535,14 +505,14 @@ var
fil : word; fil : word;
begin begin
fil:=32 or (textattr shl 8); fil:=32 or (textattr shl 8);
y:=WinMinY+y; y:=WinMin.Y+y;
While (y<=WinMaxY) do While (y<=WinMax.Y) do
begin begin
dosmemmove(VidSeg,(y*ScreenWidth+WinMinX)*2, dosmemmove(VidSeg,(y*ScreenWidth+WinMin.X)*2,
VidSeg,((y-1)*ScreenWidth+WinMinX)*2,(WinMaxX-WinMinX+1)*2); VidSeg,((y-1)*ScreenWidth+WinMin.X)*2,(WinMax.X-WinMin.X+1)*2);
inc(y); inc(y);
end; end;
dosmemfillword(VidSeg,(WinMaxY*ScreenWidth+WinMinX)*2,(WinMaxX-WinMinX+1),fil); dosmemfillword(VidSeg,(WinMax.Y*ScreenWidth+WinMin.X)*2,(WinMax.X-WinMin.X+1),fil);
end; end;
@ -559,14 +529,14 @@ var
begin begin
fil:=32 or (textattr shl 8); fil:=32 or (textattr shl 8);
y:=WhereY; y:=WhereY;
my:=WinMaxY-WinMinY; my:=WinMax.Y-WinMin.Y;
while (my>=y) do while (my>=y) do
begin begin
dosmemmove(VidSeg,((WinMinY+my-1)*ScreenWidth+WinMinX)*2, dosmemmove(VidSeg,((WinMin.Y+my-1)*ScreenWidth+WinMin.X)*2,
VidSeg,((WinMinY+my)*ScreenWidth+WinMinX)*2,(WinMaxX-WinMinX+1)*2); VidSeg,((WinMin.Y+my)*ScreenWidth+WinMin.X)*2,(WinMax.X-WinMin.X+1)*2);
dec(my); dec(my);
end; end;
dosmemfillword(VidSeg,((WinMinY+y-1)*ScreenWidth+WinMinX)*2,(WinMaxX-WinMinX+1),fil); dosmemfillword(VidSeg,((WinMin.Y+y-1)*ScreenWidth+WinMin.X)*2,(WinMax.X-WinMin.X+1),fil);
end; end;
@ -622,9 +592,9 @@ var
begin begin
case c of case c of
#10 : inc(CurrY); #10 : inc(CurrY);
#13 : CurrX:=WinMinX+1; #13 : CurrX:=WinMin.X+1;
#8 : begin #8 : begin
if CurrX>(WinMinX+1) then if CurrX>(WinMin.X+1) then
dec(CurrX); dec(CurrX);
end; end;
#7 : begin { beep } #7 : begin { beep }
@ -638,12 +608,12 @@ begin
inc(CurrX); inc(CurrX);
end; end;
end; end;
if CurrX>(WinMaxX+1) then if CurrX>(WinMax.X+1) then
begin begin
CurrX:=(WinMinX+1); CurrX:=(WinMin.X+1);
inc(CurrY); inc(CurrY);
end; end;
while CurrY>(WinMaxY+1) do while CurrY>(WinMax.Y+1) do
begin begin
removeline(1); removeline(1);
dec(CurrY); dec(CurrY);