mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 10:19:31 +01:00 
			
		
		
		
	+ added another far pointer arithmetic test
git-svn-id: trunk@27490 -
This commit is contained in:
		
							parent
							
								
									cef4092f3d
								
							
						
					
					
						commit
						bf1e15fd39
					
				
							
								
								
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							@ -10839,6 +10839,7 @@ tests/test/cpu16/i8086/tfarcal1.pp svneol=native#text/pascal
 | 
				
			|||||||
tests/test/cpu16/i8086/tfarptr1.pp svneol=native#text/pascal
 | 
					tests/test/cpu16/i8086/tfarptr1.pp svneol=native#text/pascal
 | 
				
			||||||
tests/test/cpu16/i8086/tfarptr2.pp svneol=native#text/pascal
 | 
					tests/test/cpu16/i8086/tfarptr2.pp svneol=native#text/pascal
 | 
				
			||||||
tests/test/cpu16/i8086/tfarptr3.pp svneol=native#text/pascal
 | 
					tests/test/cpu16/i8086/tfarptr3.pp svneol=native#text/pascal
 | 
				
			||||||
 | 
					tests/test/cpu16/i8086/tfarptr4.pp svneol=native#text/pascal
 | 
				
			||||||
tests/test/cpu16/i8086/tptrsize.pp svneol=native#text/pascal
 | 
					tests/test/cpu16/i8086/tptrsize.pp svneol=native#text/pascal
 | 
				
			||||||
tests/test/cpu16/taddint1.pp svneol=native#text/pascal
 | 
					tests/test/cpu16/taddint1.pp svneol=native#text/pascal
 | 
				
			||||||
tests/test/dumpclass.pp svneol=native#text/plain
 | 
					tests/test/dumpclass.pp svneol=native#text/plain
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										183
									
								
								tests/test/cpu16/i8086/tfarptr4.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								tests/test/cpu16/i8086/tfarptr4.pp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,183 @@
 | 
				
			|||||||
 | 
					{ %cpu=i8086 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ far pointer arithmetic tests }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ far pointer arithmetic should work only on the offset,
 | 
				
			||||||
 | 
					  without changing the segment }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{ this test is the same as tfarptr3, but with different numbers, designed to
 | 
				
			||||||
 | 
					  expose buggy far pointer arithmetic, where the int16 int is treated as a
 | 
				
			||||||
 | 
					  signed int and is sign extended to 32-bit and then added to the far pointer
 | 
				
			||||||
 | 
					  as a 32-bit int }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{$R-}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var
 | 
				
			||||||
 | 
					  ErrorCode: Integer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					procedure Error(Code: Integer);
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  Writeln('Error: ', code);
 | 
				
			||||||
 | 
					  ErrorCode := Code;
 | 
				
			||||||
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var
 | 
				
			||||||
 | 
					  FarPtr: FarPointer;
 | 
				
			||||||
 | 
					  FarPtr2: FarPointer;
 | 
				
			||||||
 | 
					  int16: Integer;
 | 
				
			||||||
 | 
					  int32: LongInt;
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					  ErrorCode := 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Writeln('farptr + int16_var');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $F678);
 | 
				
			||||||
 | 
					  int16 := $7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPtr + int16;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(1);
 | 
				
			||||||
 | 
					  Writeln('int16_var + farptr');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $F678);
 | 
				
			||||||
 | 
					  int16 := $7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := int16 + FarPtr;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(2);
 | 
				
			||||||
 | 
					  Writeln('farptr + int32_var');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $F678);
 | 
				
			||||||
 | 
					  int32 := $55AA7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPtr + int32;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(3);
 | 
				
			||||||
 | 
					  Writeln('int32_var + farptr');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $F678);
 | 
				
			||||||
 | 
					  int32 := $55AA7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := int32 + FarPtr;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(4);
 | 
				
			||||||
 | 
					  Writeln('farptr + int16_const');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $F678);
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPtr + $7FFF;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(5);
 | 
				
			||||||
 | 
					  Writeln('int16_const + farptr');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $F678);
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := $7FFF + FarPtr;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(6);
 | 
				
			||||||
 | 
					  Writeln('farptr + int32_const');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $F678);
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPtr + $55AA7FFF;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(7);
 | 
				
			||||||
 | 
					  Writeln('int32_const + farptr');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $F678);
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := $55AA7FFF + FarPtr;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(8);
 | 
				
			||||||
 | 
					  { const }
 | 
				
			||||||
 | 
					  Writeln('farptr_const + int16_var');
 | 
				
			||||||
 | 
					  int16 := $7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPointer($1234F678) + int16;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(9);
 | 
				
			||||||
 | 
					  Writeln('int16_var + farptr_const');
 | 
				
			||||||
 | 
					  int16 := $7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := int16 + FarPointer($1234F678);
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(10);
 | 
				
			||||||
 | 
					  Writeln('farptr_const + int32_var');
 | 
				
			||||||
 | 
					  int32 := $55AA7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPointer($1234F678) + int32;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(11);
 | 
				
			||||||
 | 
					  Writeln('int32_var + farptr_const');
 | 
				
			||||||
 | 
					  int32 := $55AA7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := int32 + FarPointer($1234F678);
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(12);
 | 
				
			||||||
 | 
					  Writeln('farptr_const + int16_const');
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPointer($1234F678) + $7FFF;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(13);
 | 
				
			||||||
 | 
					  Writeln('int16_const + farptr_const');
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := $7FFF + FarPointer($1234F678);
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(14);
 | 
				
			||||||
 | 
					  Writeln('farptr_const + int32_const');
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPointer($1234F678) + $55AA7FFF;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(15);
 | 
				
			||||||
 | 
					  Writeln('int32_const + farptr_const');
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := $55AA7FFF + FarPointer($1234F678);
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $7677) then
 | 
				
			||||||
 | 
					    Error(16);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Writeln('farptr - int16_var');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $0678);
 | 
				
			||||||
 | 
					  int16 := $7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPtr - int16;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $8679) then
 | 
				
			||||||
 | 
					    Error(17);
 | 
				
			||||||
 | 
					  Writeln('farptr - int32_var');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $0678);
 | 
				
			||||||
 | 
					  int32 := $55AA7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPtr - int32;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $8679) then
 | 
				
			||||||
 | 
					    Error(18);
 | 
				
			||||||
 | 
					  Writeln('farptr - int16_const');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $0678);
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPtr - $7FFF;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $8679) then
 | 
				
			||||||
 | 
					    Error(19);
 | 
				
			||||||
 | 
					  Writeln('farptr - int32_const');
 | 
				
			||||||
 | 
					  FarPtr := Ptr($1234, $0678);
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPtr - $55AA7FFF;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $8679) then
 | 
				
			||||||
 | 
					    Error(20);
 | 
				
			||||||
 | 
					  Writeln('farptr_const - int16_var');
 | 
				
			||||||
 | 
					  int16 := $7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPointer($12340678) - int16;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $8679) then
 | 
				
			||||||
 | 
					    Error(21);
 | 
				
			||||||
 | 
					  Writeln('farptr_const - int32_var');
 | 
				
			||||||
 | 
					  int32 := $55AA7FFF;
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPointer($12340678) - int32;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $8679) then
 | 
				
			||||||
 | 
					    Error(22);
 | 
				
			||||||
 | 
					  Writeln('farptr_const - int16_const');
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPointer($12340678) - $7FFF;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $8679) then
 | 
				
			||||||
 | 
					    Error(23);
 | 
				
			||||||
 | 
					  Writeln('farptr_const - int32_const');
 | 
				
			||||||
 | 
					  FarPtr2 := nil;
 | 
				
			||||||
 | 
					  FarPtr2 := FarPointer($12340678) - $55AA7FFF;
 | 
				
			||||||
 | 
					  if FarPtr2 <> Ptr($1234, $8679) then
 | 
				
			||||||
 | 
					    Error(24);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ErrorCode = 0 then
 | 
				
			||||||
 | 
					    Writeln('Success!')
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    Halt(ErrorCode);
 | 
				
			||||||
 | 
					end.
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user