* Patch from Nikolay adding a hline variant for VESA modes. Mantis 17073

git-svn-id: trunk@15675 -
This commit is contained in:
marco 2010-07-31 18:57:10 +00:00
parent 54758c85d8
commit 15efa8152b
2 changed files with 147 additions and 1 deletions

View File

@ -1452,7 +1452,7 @@ const CrtAddress: word = 0;
xor ah, ah
mov @Result, ax
{$else fpc}
push eax
push eax
push ebx
push ecx
push edx
@ -2565,6 +2565,7 @@ const CrtAddress: word = 0;
mode.InitMode := {$ifdef fpc}@{$endif}Init800x600x16;
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualVESA;
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveVESA;
mode.HLine := {$ifdef fpc}@{$endif}HLineVESA16;
mode.XAspect := 10000;
mode.YAspect := 10000;
AddMode(mode);
@ -2679,6 +2680,7 @@ const CrtAddress: word = 0;
mode.InitMode := {$ifdef fpc}@{$endif}Init1024x768x16;
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualVESA;
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveVESA;
mode.HLine := {$ifdef fpc}@{$endif}HLineVESA16;
mode.XAspect := 10000;
mode.YAspect := 10000;
AddMode(mode);
@ -2793,6 +2795,7 @@ const CrtAddress: word = 0;
mode.InitMode := {$ifdef fpc}@{$endif}Init1280x1024x16;
mode.SetVisualPage := {$ifdef fpc}@{$endif}SetVisualVESA;
mode.SetActivePage := {$ifdef fpc}@{$endif}SetActiveVESA;
mode.HLine := {$ifdef fpc}@{$endif}HLineVESA16;
mode.XAspect := 10000;
mode.YAspect := 10000;
AddMode(mode);

View File

@ -1583,6 +1583,149 @@ end;
PortW[$3ce] := $0001; { Index 01 : Disable ops on all four planes. }
end;
procedure HLineVESA16(x,x2,y: smallint); {$ifndef fpc}far;{$endif fpc}
var
xtmp: smallint;
ScrOfs, BankRest: longint;
HLength : word;
LMask,RMask : byte;
begin
{ must we swap the values? }
if x > x2 then
Begin
xtmp := x2;
x2 := x;
x:= xtmp;
end;
{ First convert to global coordinates }
X := X + StartXViewPort;
X2 := X2 + StartXViewPort;
Y := Y + StartYViewPort;
if ClipPixels then
Begin
if LineClipped(x,y,x2,y,StartXViewPort,StartYViewPort,
StartXViewPort+ViewWidth, StartYViewPort+ViewHeight) then
exit;
end;
Y := Y + YOffset;
ScrOfs := longint(y) * BytesPerLine + (x div 8);
SetReadBank(smallint(ScrOfs shr 16));
SetWriteBank(smallint(ScrOfs shr 16));
HLength:=x2 div 8-x div 8;
LMask:=$ff shr (x and 7);
{$ifopt r+}
{$define rangeOn}
{$r-}
{$endif}
{$ifopt q+}
{$define overflowOn}
{$q-}
{$endif}
RMask:=$ff shl (7-(x2 and 7));
{$ifdef rangeOn}
{$undef rangeOn}
{$r+}
{$endif}
{$ifdef overflowOn}
{$undef overflowOn}
{$q+}
{$endif}
if HLength=0 then
LMask:=LMask and RMask;
Port[$3ce]:=0;
If CurrentWriteMode <> NotPut Then
Port[$3cf]:= CurrentColor
else Port[$3cf]:= not CurrentColor;
Port[$3ce]:=1;
Port[$3cf]:=$f;
Port[$3ce]:=3;
case CurrentWriteMode of
XORPut:
Port[$3cf]:=3 shl 3;
ANDPut:
Port[$3cf]:=1 shl 3;
ORPut:
Port[$3cf]:=2 shl 3;
NormalPut, NotPut:
Port[$3cf]:=0
else
Port[$3cf]:=0
end;
Port[$3ce]:=8;
Port[$3cf]:=LMask;
{$ifopt r+}
{$define rangeOn}
{$r-}
{$endif}
{$ifopt q+}
{$define overflowOn}
{$q-}
{$endif}
Mem[WinWriteSeg:word(ScrOfs)]:=Mem[WinReadSeg:word(ScrOfs)]+1;
{$ifdef rangeOn}
{$undef rangeOn}
{$r+}
{$endif}
{$ifdef overflowOn}
{$undef overflowOn}
{$q+}
{$endif}
Port[$3ce]:=8;
if HLength>0 then
begin
dec(HLength);
inc(ScrOfs);
while (HLength>0) do
begin
SetReadBank(smallint(ScrOfs shr 16));
SetWriteBank(smallint(ScrOfs shr 16));
Port[$3cf]:=$ff;
if HLength <= ($10000-(ScrOfs and $ffff)) Then
BankRest := HLength
else {the rest won't fit anymore in the current window }
BankRest := $10000 - (ScrOfs and $ffff);
{$ifndef tp}
seg_bytemove(dosmemselector,(WinReadSeg shl 4)+word(ScrOfs),dosmemselector,(WinWriteSeg shl 4)+word(ScrOfs),BankRest);
{$else}
move(Ptr(WinReadSeg,word(ScrOfs))^, Ptr(WinWriteSeg,word(ScrOfs))^, BankRest);
{$endif}
ScrOfs := ScrOfs + BankRest;
HLength := HLength - BankRest;
end;
SetReadBank(smallint(ScrOfs shr 16));
SetWriteBank(smallint(ScrOfs shr 16));
Port[$3cf]:=RMask;
{$ifopt r+}
{$define rangeOn}
{$r-}
{$endif}
{$ifopt q+}
{$define overflowOn}
{$q-}
{$endif}
Mem[WinWriteSeg:word(ScrOfs)]:=Mem[WinReadSeg:word(ScrOfs)]+1;
{$ifdef rangeOn}
{$undef rangeOn}
{$r+}
{$endif}
{$ifdef overflowOn}
{$undef overflowOn}
{$q+}
{$endif}
end;
{ clean up }
Port[$3cf]:=0;
Port[$3ce]:=8;
Port[$3cf]:=$ff;
Port[$3ce]:=1;
Port[$3cf]:=0;
Port[$3ce]:=3;
Port[$3cf]:=0;
end;