mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 10:39:40 +01:00 
			
		
		
		
	* LFB modes finally work! You have to add $4000 to the mode number
if you use LFB access!
This commit is contained in:
		
							parent
							
								
									54f9d56013
								
							
						
					
					
						commit
						577075367d
					
				@ -1193,7 +1193,7 @@ type
 | 
			
		||||
           if UseNoSelector then
 | 
			
		||||
             col:=pbyte(LFBPointer+offs+LinearPageOfs)^
 | 
			
		||||
           else
 | 
			
		||||
             seg_move(WinReadSeg,offs+LinearPageOfs,get_ds,longint(@col),1);
 | 
			
		||||
             seg_move(WinWriteSeg,offs+LinearPageOfs,get_ds,longint(@col),1);
 | 
			
		||||
           col := col xor byte(CurrentColor);
 | 
			
		||||
         End;
 | 
			
		||||
       AndPut:
 | 
			
		||||
@ -1201,7 +1201,7 @@ type
 | 
			
		||||
           if UseNoSelector then
 | 
			
		||||
             col:=pbyte(LFBPointer+offs+LinearPageOfs)^
 | 
			
		||||
           else
 | 
			
		||||
             seg_move(WinReadSeg,offs+LinearPageOfs,get_ds,longint(@col),1);
 | 
			
		||||
             seg_move(WinWriteSeg,offs+LinearPageOfs,get_ds,longint(@col),1);
 | 
			
		||||
           col := col and byte(CurrentColor);
 | 
			
		||||
         End;
 | 
			
		||||
       OrPut:
 | 
			
		||||
@ -1209,7 +1209,7 @@ type
 | 
			
		||||
           if UseNoSelector then
 | 
			
		||||
             col:=pbyte(LFBPointer+offs+LinearPageOfs)^
 | 
			
		||||
           else
 | 
			
		||||
             seg_move(WinReadSeg,offs+LinearPageOfs,get_ds,longint(@col),1);
 | 
			
		||||
             seg_move(WinWriteSeg,offs+LinearPageOfs,get_ds,longint(@col),1);
 | 
			
		||||
           col := col or byte(CurrentColor);
 | 
			
		||||
         End
 | 
			
		||||
       else
 | 
			
		||||
@ -1240,8 +1240,12 @@ type
 | 
			
		||||
         exit;
 | 
			
		||||
     end;
 | 
			
		||||
     offs := longint(y) * BytesPerLine + x;
 | 
			
		||||
     {$ifdef logging}
 | 
			
		||||
     logln('putpix offset: '+hexstr(offs,8)+', color: '+strf(color)+', lpo: $'+
 | 
			
		||||
       hexstr(LinearPageOfs,8));
 | 
			
		||||
     {$endif logging}
 | 
			
		||||
     if UseNoSelector then
 | 
			
		||||
       pbyte(LFBPointer+offs+LinearPageOfs)^:=color
 | 
			
		||||
       pbyte(LFBPointer+offs+LinearPageOfs)^:=byte(color)
 | 
			
		||||
     else
 | 
			
		||||
       seg_move(get_ds,longint(@color),WinWriteSeg,offs+LinearPageOfs,1);
 | 
			
		||||
  end;
 | 
			
		||||
@ -1254,10 +1258,14 @@ type
 | 
			
		||||
     X:= X + StartXViewPort;
 | 
			
		||||
     Y:= Y + StartYViewPort;
 | 
			
		||||
     offs := longint(y) * BytesPerLine + x;
 | 
			
		||||
     {$ifdef logging}
 | 
			
		||||
     logln('getpix offset: '+hexstr(offs,8)+', lpo: $'+
 | 
			
		||||
       hexstr(LinearPageOfs,8));
 | 
			
		||||
     {$endif logging}
 | 
			
		||||
     if UseNoSelector then
 | 
			
		||||
       col:=pbyte(LFBPointer+offs+LinearPageOfs)^
 | 
			
		||||
     else
 | 
			
		||||
       seg_move(WinReadSeg,offs+LinearPageOfs,get_ds,longint(@col),1);
 | 
			
		||||
       seg_move(WinWriteSeg,offs+LinearPageOfs,get_ds,longint(@col),1);
 | 
			
		||||
     GetPixVESA256Linear:=col;
 | 
			
		||||
  end;
 | 
			
		||||
(*
 | 
			
		||||
@ -1300,6 +1308,9 @@ end;
 | 
			
		||||
  var
 | 
			
		||||
     offs : longint;
 | 
			
		||||
  begin
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
     logln('putpixvesa32kor64k('+strf(x)+','+strf(y)+')');
 | 
			
		||||
{$endif logging}
 | 
			
		||||
     X:= X + StartXViewPort;
 | 
			
		||||
     Y:= Y + StartYViewPort;
 | 
			
		||||
     { convert to absolute coordinates and then verify clipping...}
 | 
			
		||||
@ -1313,6 +1324,9 @@ end;
 | 
			
		||||
     Y := Y + YOffset; { adjust pixel for correct virtual page }
 | 
			
		||||
     offs := longint(y) * BytesPerLine + 2*x;
 | 
			
		||||
     SetWriteBank(integer(offs shr 16));
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
     logln('putpixvesa32kor64k offset: '+strf(word(offs)));
 | 
			
		||||
{$endif logging}
 | 
			
		||||
     memW[WinWriteSeg : word(offs)] := color;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
@ -1332,6 +1346,9 @@ end;
 | 
			
		||||
     offs : longint;
 | 
			
		||||
     col : word;
 | 
			
		||||
  begin
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
     logln('directputpixvesa32kor64k('+strf(x)+','+strf(y)+')');
 | 
			
		||||
{$endif logging}
 | 
			
		||||
     y:= Y + YOffset;
 | 
			
		||||
     offs := longint(y) * BytesPerLine + 2*x;
 | 
			
		||||
     SetWriteBank(integer((offs shr 16) and $ff));
 | 
			
		||||
@ -1356,6 +1373,9 @@ end;
 | 
			
		||||
           If CurrentWriteMode <> NotPut Then
 | 
			
		||||
             col := CurrentColor
 | 
			
		||||
           Else col := Not(CurrentColor);
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
           logln('directputpixvesa32kor64k offset: '+strf(word(offs)));
 | 
			
		||||
{$endif logging}
 | 
			
		||||
           memW[WinWriteSeg : word(offs)] := Col;
 | 
			
		||||
         End
 | 
			
		||||
     End;
 | 
			
		||||
@ -1398,7 +1418,7 @@ end;
 | 
			
		||||
     if UseNoSelector then
 | 
			
		||||
       color:=pword(LFBPointer+offs+LinearPageOfs)^
 | 
			
		||||
     else
 | 
			
		||||
       seg_move(WinReadSeg,offs+LinearPageOfs,get_ds,longint(@color),2);
 | 
			
		||||
       seg_move(WinWriteSeg,offs+LinearPageOfs,get_ds,longint(@color),2);
 | 
			
		||||
     GetPixVESA32kor64kLinear:=color;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
@ -1414,7 +1434,7 @@ end;
 | 
			
		||||
           if UseNoSelector then
 | 
			
		||||
             col:=pword(LFBPointer+offs+LinearPageOfs)^
 | 
			
		||||
           else
 | 
			
		||||
             seg_move(WinReadSeg,offs+LinearPageOfs,get_ds,longint(@col),2);
 | 
			
		||||
             seg_move(WinWriteSeg,offs+LinearPageOfs,get_ds,longint(@col),2);
 | 
			
		||||
           col := col xor currentcolor;
 | 
			
		||||
         End;
 | 
			
		||||
       AndPut:
 | 
			
		||||
@ -1422,7 +1442,7 @@ end;
 | 
			
		||||
           if UseNoSelector then
 | 
			
		||||
             col:=pword(LFBPointer+offs+LinearPageOfs)^
 | 
			
		||||
           else
 | 
			
		||||
             seg_move(WinReadSeg,offs+LinearPageOfs,get_ds,longint(@col),2);
 | 
			
		||||
             seg_move(WinWriteSeg,offs+LinearPageOfs,get_ds,longint(@col),2);
 | 
			
		||||
           col := col and currentcolor;
 | 
			
		||||
         End;
 | 
			
		||||
       OrPut:
 | 
			
		||||
@ -1430,7 +1450,7 @@ end;
 | 
			
		||||
           if UseNoSelector then
 | 
			
		||||
             col:=pword(LFBPointer+offs+LinearPageOfs)^
 | 
			
		||||
           else
 | 
			
		||||
             seg_move(WinReadSeg,offs+LinearPageOfs,get_ds,longint(@col),2);
 | 
			
		||||
             seg_move(WinWriteSeg,offs+LinearPageOfs,get_ds,longint(@col),2);
 | 
			
		||||
           col := col or currentcolor;
 | 
			
		||||
         End
 | 
			
		||||
       else
 | 
			
		||||
@ -1578,6 +1598,9 @@ end;
 | 
			
		||||
    begin
 | 
			
		||||
      if DirectColor then
 | 
			
		||||
        Begin
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
          logln('setvesargbpalette called with directcolor = true');
 | 
			
		||||
{$endif logging}
 | 
			
		||||
          _GraphResult := grError;
 | 
			
		||||
          exit;
 | 
			
		||||
        end;
 | 
			
		||||
@ -1633,6 +1656,9 @@ end;
 | 
			
		||||
 | 
			
		||||
            if word(regs.eax) <> $004F then
 | 
			
		||||
              begin
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
                logln('setvesargbpalette failed while directcolor = false!');
 | 
			
		||||
{$endif logging}
 | 
			
		||||
                _GraphResult := grError;
 | 
			
		||||
                exit;
 | 
			
		||||
              end;
 | 
			
		||||
@ -1658,6 +1684,9 @@ end;
 | 
			
		||||
   begin
 | 
			
		||||
      if DirectColor then
 | 
			
		||||
        Begin
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
         logln('getvesargbpalette called with directcolor = true');
 | 
			
		||||
{$endif logging}
 | 
			
		||||
          _GraphResult := grError;
 | 
			
		||||
          exit;
 | 
			
		||||
        end;
 | 
			
		||||
@ -1703,6 +1732,9 @@ end;
 | 
			
		||||
 | 
			
		||||
            if word(regs.eax) <> $004F then
 | 
			
		||||
              begin
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
                logln('getvesargbpalette failed while directcolor = false!');
 | 
			
		||||
{$endif logging}
 | 
			
		||||
                _GraphResult := grError;
 | 
			
		||||
                exit;
 | 
			
		||||
              end
 | 
			
		||||
@ -1909,8 +1941,15 @@ Const
 | 
			
		||||
     end;
 | 
			
		||||
     FrameBufferLinearAddress:=Get_linear_addr(VESAModeInfo.PhysAddress and $FFFF0000,
 | 
			
		||||
       VESAInfo.TotalMem shl 16);
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
     logln('framebuffer linear address: '+hexstr(FrameBufferLinearAddress div (1024*1024),8));
 | 
			
		||||
     logln('total mem shl 16: '+strf(vesainfo.totalmem shl 16));
 | 
			
		||||
{$endif logging}
 | 
			
		||||
     if int31error<>0 then
 | 
			
		||||
       begin
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
         logln('Unable to get linear address for '+hexstr(VESAModeInfo.PhysAddress,8));
 | 
			
		||||
{$endif logging}
 | 
			
		||||
         writeln(stderr,'Unable to get linear address for ',hexstr(VESAModeInfo.PhysAddress,8));
 | 
			
		||||
         exit;
 | 
			
		||||
       end;
 | 
			
		||||
@ -1924,17 +1963,22 @@ Const
 | 
			
		||||
     else
 | 
			
		||||
       begin
 | 
			
		||||
         WinWriteSeg:=allocate_ldt_descriptors(1);
 | 
			
		||||
         WinReadSeg:=allocate_ldt_descriptors(1);
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
         logln('writeseg1: '+hexstr(winwriteseg,8));
 | 
			
		||||
{$endif logging}
 | 
			
		||||
         set_segment_base_address(WinWriteSeg,FrameBufferLinearAddress);
 | 
			
		||||
         set_segment_limit(WinWriteSeg,(VESAInfo.TotalMem shl 16)-1);
 | 
			
		||||
         set_segment_base_address(WinReadSeg,FrameBufferLinearAddress);
 | 
			
		||||
         set_segment_limit(WinReadSeg,(VESAInfo.TotalMem shl 16)-1);
 | 
			
		||||
         lock_linear_region(FrameBufferLinearAddress,(VESAInfo.TotalMem shl 16));
 | 
			
		||||
         if int31error<>0 then
 | 
			
		||||
           begin
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
             logln('Error in linear memory selectors creation');
 | 
			
		||||
{$endif logging}
 | 
			
		||||
             writeln(stderr,'Error in linear memory selectors creation');
 | 
			
		||||
             exit;
 | 
			
		||||
           end;
 | 
			
		||||
       end;
 | 
			
		||||
     LinearPageOfs := 0;
 | 
			
		||||
     InLinear:=true;
 | 
			
		||||
     SetUpLinear:=true;
 | 
			
		||||
     { WinSize:=(VGAInfo.TotalMem shl 16);
 | 
			
		||||
@ -2086,6 +2130,9 @@ Const
 | 
			
		||||
     if (VESAModeInfo.attr and modeAvail) = 0 then
 | 
			
		||||
       begin
 | 
			
		||||
         SetVESAmode := FALSE;
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
         logln('  vesa mode '+strf(mode)+' not supported!!!');
 | 
			
		||||
{$endif logging}
 | 
			
		||||
         _GraphResult := grError;
 | 
			
		||||
         exit;
 | 
			
		||||
       end;
 | 
			
		||||
@ -2125,6 +2172,9 @@ Const
 | 
			
		||||
  LogLn('Window size: '+strf(VESAModeInfo.winSize)+'kb');
 | 
			
		||||
  LogLn('Bytes per line: '+strf(bytesperline));
 | 
			
		||||
{$endif logging}
 | 
			
		||||
   { Select the correct mode number if we're going to use linear access! }
 | 
			
		||||
   if InLinear then
 | 
			
		||||
     inc(mode,$4000);
 | 
			
		||||
 | 
			
		||||
   asm
 | 
			
		||||
    mov ax,4F02h
 | 
			
		||||
@ -2353,6 +2403,7 @@ Const
 | 
			
		||||
{$endif fpc}
 | 
			
		||||
      mov  [VideoMode], al
 | 
			
		||||
    end;
 | 
			
		||||
(*
 | 
			
		||||
{$ifdef logging}
 | 
			
		||||
        LogLn('Prepare to save VESA video state');
 | 
			
		||||
{$endif logging}
 | 
			
		||||
@ -2422,6 +2473,7 @@ Const
 | 
			
		||||
        regs.ebx := 0;
 | 
			
		||||
        RealIntr($10,regs);
 | 
			
		||||
      end;
 | 
			
		||||
*)
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
 procedure RestoreStateVESA; {$ifndef fpc}far;{$endif fpc}
 | 
			
		||||
@ -2595,7 +2647,11 @@ Const
 | 
			
		||||
 | 
			
		||||
(*
 | 
			
		||||
$Log$
 | 
			
		||||
Revision 1.24  2000-06-07 07:41:44  jonas
 | 
			
		||||
Revision 1.25  2000-07-08 07:48:38  jonas
 | 
			
		||||
  * LFB modes finally work! You have to add $4000 to the mode number
 | 
			
		||||
    if you use LFB access!
 | 
			
		||||
 | 
			
		||||
Revision 1.24  2000/06/07 07:41:44  jonas
 | 
			
		||||
  * always set SetupLinear to false at the start of the routine (there
 | 
			
		||||
    were some "exit" statements which returned without the function
 | 
			
		||||
    result being set otherwise)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user