mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 11:53:42 +01: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
	 Jonas Maebe
						Jonas Maebe