1{ %CPU=i8086 } 2program tasm17; 3 4{ This test is TP7 compatible } 5 6{$ifndef FPC} 7type 8 CodePointer = Pointer; 9{$endif} 10 11var 12 xx: word; 13 14const 15 expect1: array [0..6] of word = 16 (Ofs(xx),Ofs(xx),Ofs(xx),Seg(xx),Ofs(xx),0,$aa55); 17 18var 19 expect2: array [0..6] of word; 20 expect3: array [0..6] of word; 21 expect4: array [0..12] of word; 22 23procedure test1; assembler; {$IFDEF FPC_MM_HUGE}nostackframe;{$ENDIF} 24asm 25 dw xx 26 dw offset xx 27 dd xx 28 dd offset xx 29 db 55h, 0aah 30end; 31 32procedure test2; assembler; {$IFDEF FPC_MM_HUGE}nostackframe;{$ENDIF} 33asm 34 dw xx+5 35 dw offset xx+6 36 dd xx+7 37 dd offset xx+8 38 db 55h, 0aah 39end; 40 41procedure test3; assembler; {$IFDEF FPC_MM_HUGE}nostackframe;{$ENDIF} 42asm 43 dw 9+xx 44 dw 11+offset xx 45 dd 12+xx 46 dd 14+offset xx 47 db 55h, 0aah 48end; 49 50procedure test4; assembler; {$IFDEF FPC_MM_HUGE}nostackframe;{$ENDIF} 51asm 52 nop 53 nop 54@jumptab: 55 nop 56 nop 57 dw @jumptarget 58 nop 59 nop 60 dw offset @jumptarget 61 nop 62 nop 63 dd @jumptarget 64 nop 65 nop 66 dd offset @jumptarget 67 nop 68 nop 69@jumptarget: 70 db 55h, 0aah 71end; 72 73procedure Error; 74begin 75 Writeln('Error!'); 76 Halt(1); 77end; 78 79{ This version works in all i8086 memory models } 80function CompareCode(cp: CodePointer; dp: Pointer; sz: Integer): Boolean; 81var 82 I: Integer; 83begin 84 for I := 0 to sz - 1 do 85 if Mem[Seg(cp^):Ofs(cp^) + I] <> Mem[Seg(dp^):Ofs(dp^) + I] then 86 begin 87 CompareCode := False; 88 exit; 89 end; 90 CompareCode := True; 91end; 92 93begin 94 if not CompareCode(CodePointer(@test1), @expect1, SizeOf(expect1)) then 95 Error; 96 97 expect2[0] := Ofs(xx)+5; 98 expect2[1] := Ofs(xx)+6; 99 expect2[2] := Ofs(xx)+7; 100 expect2[3] := Seg(xx); 101 expect2[4] := Ofs(xx)+8; 102 expect2[5] := 0; 103 expect2[6] := $aa55; 104 if not CompareCode(CodePointer(@test2), @expect2, SizeOf(expect2)) then 105 Error; 106 107 expect3[0] := Ofs(xx)+9; 108 expect3[1] := Ofs(xx)+11; 109 expect3[2] := Ofs(xx)+12; 110 expect3[3] := Seg(xx); 111 expect3[4] := Ofs(xx)+14; 112 expect3[5] := 0; 113 expect3[6] := $aa55; 114 if not CompareCode(CodePointer(@test3), @expect3, SizeOf(expect3)) then 115 Error; 116 117 expect4[0] := $9090; 118 expect4[1] := $9090; 119 expect4[2] := Ofs(test4) + 24; 120 expect4[3] := $9090; 121 expect4[4] := Ofs(test4) + 24; 122 expect4[5] := $9090; 123 expect4[6] := Ofs(test4) + 24; 124 expect4[7] := Seg(test4); 125 expect4[8] := $9090; 126 expect4[9] := Ofs(test4) + 24; 127 expect4[10] := 0; 128 expect4[11] := $9090; 129 expect4[12] := $aa55; 130 if not CompareCode(CodePointer(@test4), @expect4, SizeOf(expect4)) then 131 Error; 132 133 Writeln('Ok!'); 134end. 135