mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-30 21:00:30 +02:00
+ getscanline16
This commit is contained in:
parent
cc0428dcda
commit
c8541db634
@ -447,6 +447,129 @@ CONST
|
||||
{$endif asmgraph}
|
||||
end;
|
||||
|
||||
Procedure GetScanLine16(y: integer; var data);
|
||||
|
||||
var dummylong: longint;
|
||||
Offset, count, count2, amount, index: word;
|
||||
shift, plane: byte;
|
||||
Begin
|
||||
{$ifdef logging}
|
||||
LogLn('GetScanLine16 start, length to get: '+strf(ViewWidth+1)+' at y = '+strf(y));
|
||||
{$Endif logging}
|
||||
PortB[$3ce] := 4;
|
||||
offset := (Y + StartYViewPort) * 80 + (StartXViewPort shr 3) + VideoOfs;
|
||||
{$ifdef logging}
|
||||
LogLn('Offset: '+HexStr(offset,4)+' - ' + strf(offset));
|
||||
{$Endif logging}
|
||||
{ first get enough pixels so offset is 32bit aligned }
|
||||
amount := 0;
|
||||
index := 0;
|
||||
If ((StartXViewPort and 31) <> 0) Or
|
||||
(ViewWidth < 32) Then
|
||||
Begin
|
||||
If (ViewWidth >= 32+32-(StartXViewPort and 31)) Then
|
||||
amount := 32-(StartXViewPort and 31)
|
||||
Else amount := ViewWidth + 1;
|
||||
{$ifdef logging}
|
||||
LogLn('amount to align to 32bits or to get all: ' + strf(amount));
|
||||
{$Endif logging}
|
||||
For count := 0 to amount-1 do
|
||||
WordArray(Data)[Count] := getpixel16(Count,y);
|
||||
index := count+1;
|
||||
Inc(Offset,(amount+7) shr 3);
|
||||
{$ifdef logging}
|
||||
LogLn('offset now: '+HexStr(offset,4)+' - ' + strf(offset));
|
||||
LogLn('index now: '+strf(index));
|
||||
{$Endif logging}
|
||||
End;
|
||||
amount := ViewWidth + 1 - amount;
|
||||
{$ifdef logging}
|
||||
LogLn('amount left: ' + strf(amount));
|
||||
{$Endif logging}
|
||||
If amount = 0 Then Exit;
|
||||
{ first get everything from plane 3 (4th plane) }
|
||||
PortB[$3cf] := 3;
|
||||
Count := 0;
|
||||
For Count := 1 to (amount shr 5) Do
|
||||
Begin
|
||||
dummylong := MemL[$a000:offset+(Count-1)*4];
|
||||
dummylong :=
|
||||
((dummylong and $ff) shl 24) or
|
||||
((dummylong and $ff00) shl 8) or
|
||||
((dummylong and $ff0000) shr 8) or
|
||||
((dummylong and $ff000000) shr 24);
|
||||
For Count2 := 31 downto 0 Do
|
||||
Begin
|
||||
WordArray(Data)[index+Count2] := DummyLong and 1;
|
||||
DummyLong := DummyLong shr 1;
|
||||
End;
|
||||
Inc(Index, 32);
|
||||
End;
|
||||
{ Now get the data from the 3 other planes }
|
||||
plane := 3;
|
||||
Repeat
|
||||
Dec(Index,Count*32);
|
||||
Dec(plane);
|
||||
PortB[$3cf] := plane;
|
||||
Count := 0;
|
||||
For Count := 1 to (amount shr 5) Do
|
||||
Begin
|
||||
dummylong := MemL[$a000:offset+(Count-1)*4];
|
||||
dummylong :=
|
||||
((dummylong and $ff) shl 24) or
|
||||
((dummylong and $ff00) shl 8) or
|
||||
((dummylong and $ff0000) shr 8) or
|
||||
((dummylong and $ff000000) shr 24);
|
||||
For Count2 := 31 downto 0 Do
|
||||
Begin
|
||||
WordArray(Data)[index+Count2] :=
|
||||
(WordArray(Data)[index+Count2] shl 1) + (DummyLong and 1);
|
||||
DummyLong := DummyLong shr 1;
|
||||
End;
|
||||
Inc(Index, 32);
|
||||
End;
|
||||
Until plane = 0;
|
||||
amount := amount and 31;
|
||||
Dec(index);
|
||||
{$ifdef Logging}
|
||||
LogLn('Last array index written to: '+strf(index));
|
||||
LogLn('amount left: '+strf(amount)+' starting at x = '+strf(index+1));
|
||||
{$Endif logging}
|
||||
For Count := 1 to amount Do
|
||||
WordArray(Data)[index+Count] := getpixel16(index+Count,y);
|
||||
{$ifdef logging}
|
||||
LogLn('First 32 bytes gotten with getscanline16: ');
|
||||
If ViewWidth + 1 >= 32 Then
|
||||
Count2 := 32
|
||||
Else Count2 := ViewWidth;
|
||||
For Count := 0 to Count2-1 Do
|
||||
Log(strf(WordArray(Data)[Count])+' ');
|
||||
LogLn('');
|
||||
If ViewWidth + 1 >= 32 Then
|
||||
Begin
|
||||
LogLn('Last 32 bytes gotten with getscanline16: ');
|
||||
For Count := 31 downto 0 Do
|
||||
Log(strf(WordArray(Data)[ViewWidth-Count])+' ');
|
||||
End;
|
||||
LogLn('');
|
||||
GetScanLineDefault(y,Data);
|
||||
LogLn('First 32 bytes gotten with getscanlinedef: ');
|
||||
If ViewWidth + 1 >= 32 Then
|
||||
Count2 := 32
|
||||
Else Count2 := ViewWidth;
|
||||
For Count := 0 to Count2-1 Do
|
||||
Log(strf(WordArray(Data)[Count])+' ');
|
||||
LogLn('');
|
||||
If ViewWidth + 1 >= 32 Then
|
||||
Begin
|
||||
LogLn('Last 32 bytes gotten with getscanlinedef: ');
|
||||
For Count := 31 downto 0 Do
|
||||
Log(strf(WordArray(Data)[ViewWidth-Count])+' ');
|
||||
End;
|
||||
LogLn('');
|
||||
LogLn('GetScanLine16 end');
|
||||
{$Endif logging}
|
||||
End;
|
||||
|
||||
Procedure DirectPutPixel16(X,Y : Integer); {$ifndef fpc}far;{$endif fpc}
|
||||
{ x,y -> must be in global coordinates. No clipping. }
|
||||
@ -1828,6 +1951,7 @@ const CrtAddress: word = 0;
|
||||
mode.SetVisualPage := SetVisual200;
|
||||
mode.SetActivePage := SetActive200;
|
||||
mode.InitMode := Init640x200x16;
|
||||
mode.GetScanLine := GetScanLine16;
|
||||
{$else fpc}
|
||||
mode.DirectPutPixel:=@DirectPutPixel16;
|
||||
mode.PutPixel:=@PutPixel16;
|
||||
@ -1839,6 +1963,7 @@ const CrtAddress: word = 0;
|
||||
mode.InitMode := @Init640x200x16;
|
||||
mode.HLine := @HLine16;
|
||||
mode.VLine := @VLine16;
|
||||
mode.GetScanLine := @GetScanLine16;
|
||||
{$endif fpc}
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
@ -1863,6 +1988,7 @@ const CrtAddress: word = 0;
|
||||
mode.GetRGBPalette := GetVGARGBPalette;
|
||||
mode.SetVisualPage := SetVisual350;
|
||||
mode.SetActivePage := SetActive350;
|
||||
mode.GetScanLine := GetScanLine16;
|
||||
{$else fpc}
|
||||
mode.DirectPutPixel:=@DirectPutPixel16;
|
||||
mode.PutPixel:=@PutPixel16;
|
||||
@ -1874,6 +2000,7 @@ const CrtAddress: word = 0;
|
||||
mode.SetActivePage := @SetActive350;
|
||||
mode.HLine := @HLine16;
|
||||
mode.VLine := @VLine16;
|
||||
mode.GetScanLine := @GetScanLine16;
|
||||
{$endif fpc}
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
@ -1898,6 +2025,7 @@ const CrtAddress: word = 0;
|
||||
mode.InitMode := Init640x480x16;
|
||||
mode.SetVisualPage := SetVisual480;
|
||||
mode.SetActivePage := SetActive480;
|
||||
mode.GetScanLine := GetScanLine16;
|
||||
{$else fpc}
|
||||
mode.DirectPutPixel:=@DirectPutPixel16;
|
||||
mode.PutPixel:=@PutPixel16;
|
||||
@ -1909,6 +2037,7 @@ const CrtAddress: word = 0;
|
||||
mode.SetActivePage := @SetActive480;
|
||||
mode.HLine := @HLine16;
|
||||
mode.VLine := @VLine16;
|
||||
mode.GetScanLine := @GetScanLine16;
|
||||
{$endif fpc}
|
||||
mode.XAspect := 10000;
|
||||
mode.YAspect := 10000;
|
||||
@ -2626,7 +2755,10 @@ const CrtAddress: word = 0;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.17 1999-09-24 11:31:38 jonas
|
||||
Revision 1.18 1999-09-24 14:22:38 jonas
|
||||
+ getscanline16
|
||||
|
||||
Revision 1.17 1999/09/24 11:31:38 jonas
|
||||
* fixed another typo :(
|
||||
|
||||
Revision 1.16 1999/09/23 14:00:41 jonas
|
||||
|
Loading…
Reference in New Issue
Block a user